2013-12-09 2 views
0

Я изучаю привязку данных в настоящий момент и сталкиваюсь с некоторыми проблемами с родительскими и дочерними datacontexts.Переопределить родительский datacontext

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" 
     DataContext="{Binding Group}" 
     d:DataContext="{Binding Groups[0], Source={d:DesignData Source=/DataModel/SampleData.json, Type=data:SampleDataSource}}"> 
     <Grid.ChildrenTransitions> 
      <TransitionCollection> 
       <EntranceThemeTransition/> 
      </TransitionCollection> 
     </Grid.ChildrenTransitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="140"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 


<StackPanel x:Name="SideData" Width="480" Margin="12,12,24,12" Grid.Row="1" HorizontalAlignment="Left" DataContext="{Binding SideItem}"> 
     <TextBlock x:Name="SideText"  Text="{Binding Title}" Margin="12,12,12,12" Style="{StaticResource SubheaderTextBlockStyle}" MaxHeight="60"/> 
     <Image x:Name="SideImage"   Source="{Binding ImagePath}" Height="400" Width="400" Margin="0,0,0,20" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}"/> 
     <TextBlock x:Name="SideDescription" Text="{Binding Subtitle}" Margin="0,0,0,0" Style="{StaticResource BodyTextBlockStyle}"/> 
    </StackPanel> 

Я хочу оставить DataContext для Энергосистемы в «группе», но я хочу, чтобы все элементы управления внутри StackPanel быть привязанными к «SideItem».

Уверен, что я сделал это неправильно, так как он не работает должным образом. Когда я привязываю datacontext Grid к «SideItem», он работает, но это меняет все, поэтому это довольно бессмысленно. Помогите?

Кроме того, здесь бэкенд (я использую шаблон в Visual Studio 2013):

private async void navigationHelper_LoadState(object sender, LoadStateEventArgs e) 
{ 
    // TODO: Create an appropriate data model for your problem domain to replace the sample data 
    var group = await SampleDataSource.GetGroupAsync((String)e.NavigationParameter); 
    this.DefaultViewModel["Group"] = group; 
    this.DefaultViewModel["Items"] = group.Items; 
    this.DefaultViewModel["SideItem"] = group.Items.First(); 
} 
+0

Если вы хотите управления, которые внутри StackPanel были связаны с SideItem возможно вас установит DataContext из stackpanel в SideItem? – Tony

+0

пробовал, что первый ... не работает .. вот что меня сбивает с толку – ForeverLearning

ответ

0

Просто установите DataContext панели стека:

<StackPanel DataContext="{Binding SideItem}" ... 
+0

Я сделал это первым, не работает по какой-то причине – ForeverLearning

+0

Что не сработало? SideItem является собственностью группы? – Alberto

+0

SideItem сам по себе, я отредактировал код выше к тому, что я пробовал (так же, как ваш ответ, я думаю?). – ForeverLearning

0

Это кажется SideItem должен свойство Group, правильно? Что такое группа в вашем коде?

EDIT:

Если вы хотите связать с SideItem, которая связана с окном, попробуйте следующее:

<StackPanel DataContext="{Binding SideItem, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"> 
+0

Я понимаю, что могу использовать это: Text = "{Binding Items [0] .Title}", но могу ли я иметь SideItem как полностью отдельный DataContext? – ForeverLearning

+1

@ForeverLearning Смотрите, ваша сетка привязана к экземпляру 'Group'. Когда вы пишете 'Items [0] .Title', тогда WPF ищет значение здесь:' Group.Items [0] .Title', и это нормально. Когда вы пишете '{Binding SideItem}' WPF ищет свойство здесь: 'Group.SideItem' и нет такого свойства! В этом случае ваша группа должна иметь свойство SideItem. Или попробуйте написать вот так: '' Потому что SideItem связан с окном, которое я предполагаю (или управляю). – Tony

Смежные вопросы