【问题标题】:Problem binding View to ViewModel with DataTemplate使用 DataTemplate 将 View 绑定到 ViewModel 的问题
【发布时间】:2011-05-03 13:32:48
【问题描述】:

我最近开始尝试理解 MVVM 并且正在使用 MvvmFoundation 类。我正在尝试将 DataTemplate 用于 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>

【问题讨论】:

    标签: c# wpf mvvm binding


    【解决方案1】:

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

    【讨论】:

    • 太棒了,非常感谢。被我自己的测试代码打败了!感觉有点违反直觉,它不会被过度使用,但我明白为什么。再次感谢
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多