2010-11-01 94 views
4

我最近开始尝试理解MVVM,并使用MvvmFoundation类。我正在尝试为View Model类使用DataTemplate来显示视图。 XAML代码如下所示:TVM是TrackViewModel类型的属性。问题绑定使用DataTemplate查看ViewModel

使用DataContext放置在堆栈面板中的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中的轨迹视图和instansiated TrackViewModel,TVM之间的联系。因此,TrackViewModel的PropertyChangedEventHandler在非工作情况下显示为空,但在直接设置Datacontext时没有问题。

任何想法非常感谢。

的轨迹视图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> 

回答

5

由于要设置在UserControl XAML的DataContext,它不会在ContentControl情况下继承。在第二种情况下,您正在明确设置它,它将在UserControl声明中设置时覆盖。删除这将允许UserControl继承ContentControlDataContext,这将是您在Binding中设置的内容。

+0

这很棒,非常感谢。被我自己的测试代码击败! 感觉有点违反直觉,它不会被过度骑行,但我明白为什么。再次感谢 – rjw 2010-11-01 23:48:22