#c# #xaml #windows-phone-8 #data-binding #windows-phone-8.1
#c# #xaml #windows-phone-8 #привязка данных #windows-phone-8.1
Вопрос:
У меня возникла проблема с переопределением datacontext, унаследованного от родителя. У меня установлен глобальный DataContext, после чего раздел Hub привязывается к списку в этой модели, который затем распространяется на Listivew. Теперь каждый элемент listview привязан к объекту, который также является DataContext элемента. Но каждый элемент listview имеет всплывающее окно. Теперь всплывающее окно наследует элемент DataContext, и это нормально, но один элемент во всплывающем окне должен быть привязан к элементу исходной глобальной модели.
Итак, в настоящее время у меня есть следующая страница
<Page
x:Class="LocationSave.HubPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:LocationSave"
Name="root"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="using:Microsoft.Xaml.Interactivity"
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
xmlns:data="using:LocationSave.Data"
mc:Ignorable="d" FontFamily="Global User Interface">
<Page.Resources>
<ResourceDictionary>
<Flyout x:Name="Edit_Flyout">
<Border DataContext="{Binding}" >
<StackPanel Orientation="Vertical" >
<ListView
DataContext= "{Binding The Problem is here}"
ItemsSource="{Binding}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Border>
</Flyout>
</ResourceDictionary>
</Page.Resources>
<Grid x:Name="LayoutRoot">
<Hub x:Name="Hub" x:Uid="Hub" >
<HubSection x:Uid="Location_View" Header="Locations"
DataContext="{Binding Locations}" HeaderTemplate="{ThemeResource HubSectionHeaderTemplate}">
<HubSection.Resources>
<DataTemplate x:Key="Location_Item_Template">
<ListView
AutomationProperties.AutomationId="ItemListViewSection5"
AutomationProperties.Name="Items In Group"
SelectionMode="None"
IsItemClickEnabled="True"
ItemsSource="{Binding}"
ItemTemplate="{StaticResource LocationItem_Template}"
ItemClick="ItemView_ItemClick"
ContinuumNavigationTransitionInfo.ExitElementContainer="True"/>
</DataTemplate>
</HubSection.Resources>
<StaticResource ResourceKey="Location_Item_Template"/>
</HubSection>
</Hub>
</Grid>
Я попытался установить datacontext с помощью путей и т. Д., Похоже, ничего не работает, и наследование перезаписывается неправильно, а DataContext всегда равен нулю.
Любая помощь будет принята с благодарностью.
Комментарии:
1. В чем именно заключается проблема, с которой вы столкнулись? Что вы пробовали? Вы пытались установить контекст данных в исходном коде?
2. Это работает, если я устанавливаю его в фоновом режиме, но это было не то, что я искал. Я решил, добавив сопоставление с источником в статических ресурсах. Опубликую его немного позже.
3. Какие выражения привязки вы пробовали и какова форма вашей модели представления?
Ответ №1:
Итак, я решил это, добавив CollectionViewSource на страницу.Ресурсы, которые указывали на правильное свойство корневой ViewModel и с правильным DataContext.
<CollectionViewSource x:Key="SuggestionsModel" Source="{Binding Suggestions}"></CollectionViewSource>
Ответ №2:
У меня была похожая проблема, когда я хотел переопределить унаследованный DataContext и использовать DataContext по умолчанию, который я установил для всей страницы. Я решил это, установив свойство x:Name для элемента страницы <Page ... x:Name="MyPage">
, а затем привязал его к контексту данных, используя свойство element name объекта привязки следующим образом: Source="{Binding ElementName=MyPage, Path=DataContext.DesiredProperty}"
. Надеюсь, это кому-нибудь поможет.