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>
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