2010-11-01 4 views
4

J'ai récemment commencé à essayer de donner un sens à MVVM et j'utilise les classes MvvmFoundation. J'essaie d'utiliser un DataTemplate pour une classe View Model pour afficher la vue. Le code XAML est ci-dessous: TVM est une propriété de type TrackViewModel.Problème de liaison View to ViewModel avec DataTemplate

Le TrackView placé dans le panneau Stack à l'aide d'un DataContext s'affiche correctement. La version de contrôle du contenu s'affiche sous la forme d'un TrackViewModel vide.

<Window.Resources> 
    <DataTemplate DataType="{x:Type vm:TrackViewModel}" > 
     <v:TrackView/> 
    </DataTemplate> 
</Window.Resources> 
<StackPanel> 
    <ContentControl Width="200" Height="50" Content="{Binding Path=TVM, UpdateSourceTrigger=PropertyChanged}"/> 
    <v:TrackView DataContext="{Binding TVM}"/> 
</StackPanel> 

Il semble que je nai mis en place un lien entre le TrackView dans le DataTemplate et la instansiated TrackViewModel, TVM. Par conséquent, les propriétés PropertyChangedEventHandler de TrackViewModel apparaissent comme nulles dans le cas non fonctionnel, mais sont correctes lorsque je définis directement le Datacontext.

Toute pensée grandement appréciée.

Le TrackView XAML est comme ci-dessous:

<UserControl.DataContext> 
    <vm:TrackViewModel/> 
</UserControl.DataContext> 

<UserControl.Resources> 
    <LinearGradientBrush x:Key="barBackgroundBrush" StartPoint="0,0" EndPoint="0,1" Opacity="0.7"> 
     <GradientStop Offset="0" Color="Blue"/> 
     <GradientStop Offset="0.3" Color="Aquamarine"/> 
     <GradientStop Offset="1" Color="Blue"/> 
    </LinearGradientBrush> 
    <LinearGradientBrush x:Key="barTrackingBrush" StartPoint="0,0" EndPoint="0,1" Opacity="0.7"> 
     <GradientStop Offset="0" Color="Orange"/> 
     <GradientStop Offset="0.3" Color="OrangeRed"/> 
     <GradientStop Offset="1" Color="Orange"/> 

    </LinearGradientBrush> 

    <DataTemplate x:Key="RegionDataTemplate" > 
     <Border CornerRadius="5" BorderThickness="3" Background="{StaticResource barTrackingBrush}" 
        Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Canvas}}}" 
        Width="{Binding Path=Duration}"> 
      <Border.RenderTransform> 
       <TranslateTransform X="{Binding Path=StartFrame}"/> 
      </Border.RenderTransform> 
     </Border> 
    </DataTemplate> 
     <UserControl.DataContext> 
    <vm:TrackViewModel/> 
</UserControl.DataContext> 
</UserControl.Resources> 

<StackPanel> 
    <ItemsControl ItemsSource="{Binding Path=Regions, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" ItemTemplate="{StaticResource RegionDataTemplate}" VerticalAlignment="Center"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Canvas Background="{StaticResource barBackgroundBrush}" Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Panel}}}" VerticalAlignment="Stretch"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 
</StackPanel> 

Répondre

5

Puisque vous définissez le DataContext dans le UserControl XAML, il ne sera pas héritée dans le cas ContentControl. Dans le second cas, vous le définissez explicitement, ce qui est prioritaire lorsqu'il est défini dans la déclaration UserControl. La suppression de ceci permettra au UserControl d'hériter du DataContext du ContentControl, qui sera le Contenu que vous avez défini dans le Binding.

+0

C'est génial, merci beaucoup. Vaincu par mon propre code de test! Sent un peu contre-intuitif que ce ne serait pas trop monté mais je comprends pourquoi. Merci encore – rjw

Questions connexes