我最近开始尝试理解MVVM并使用MvvmFoundation类。我试图使用DataTemplate for View Model类来显示View。 XAML代码如下:TVM是TrackViewModel类型的属性。
使用DataContext放置在Stack面板中的TrackView可以正确显示。内容控件版本呈现为空的TrackViewModel。
<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>
似乎我没有在DataTemplate中的TrackView和未实现的TrackViewModel,TVM之间建立链接。因此,TrackViewModel的PropertyChangedEventHandler在非工作情况下显示为null,但直接设置Datacontext时就可以了。
任何想法都非常感激。
TrackView XAML如下:
<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>
答案 0 :(得分:5)
由于您在DataContext
XAML中设置了UserControl
,因此不会在ContentControl
情况下继承它。在第二种情况下,您将显式设置它,它将在UserControl
声明中设置时覆盖。删除此选项将允许UserControl
继承DataContext
的{{1}},ContentControl
将是您在Binding
中设置的内容。