2010-11-01 92 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