C# 使用DataTemplate将视图绑定到ViewModel时出现问题

C# 使用DataTemplate将视图绑定到ViewModel时出现问题,c#,wpf,mvvm,binding,C#,Wpf,Mvvm,Binding,我最近开始尝试理解MVVM,并且正在使用MvvmFoundation类。我试图使用视图模型类的DataTemplate来显示视图。XAML代码如下:TVM是TrackViewModel类型的属性 <Window.Resources> <DataTemplate DataType="{x:Type vm:TrackViewModel}" > <v:TrackView/> </DataTemplate> </Wi

我最近开始尝试理解MVVM,并且正在使用MvvmFoundation类。我试图使用视图模型类的DataTemplate来显示视图。XAML代码如下:TVM是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>
使用DataContext放置在堆栈面板中的轨迹视图将正确显示。内容控件版本呈现为空的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和实例TrackView模型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>


由于您正在
UserControl
XAML中设置
DataContext
,因此在
ContentControl
案例中不会继承它。在第二种情况下,您显式地设置它,当在
UserControl
声明中设置它时,它将重写。删除此项将允许
UserControl
继承
ContentControl
DataContext
,这将是您在
绑定中设置的内容,非常感谢。被我自己的测试代码打败了!感觉有点违反直觉,它不会被过度使用,但我理解为什么。再次感谢