1

我有一个ContentControl需要ContentTemplate动态设置的。

所以我决定写 2 DataTemplates,然后设置我的样式ContentControl,以便在我的视图模型中的布尔依赖属性更改(真/假)时触发触发器并设置正确的模板(dt1/dt2)。

但问题是如果 Boolean 属性主要设置为true,则数据模板将始终为dt1,并且将属性更改为false不会将模板更改为dt2

由于数据触发器绑定到布尔依赖属性,不应该更改属性导致触发触发器吗?

笔记:

  • 有一个按钮MyView可以改变BooleanDependencyProp它的点击事件。
  • MyViewModel继承自实现INotifyPropertyChanged.

xml:

<UserControl x:Class="Views.MyView">
...

<StackPanel>
    <ContentControl Content="{Binding RelativeSource={RelativeSource AncestorType=MyView}, Path=MyViewModel}">
        <ContentControl.Style>
            <Style TargetType="{x:Type ContentControl}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding BooleanDependencyProp}" Value="true">
                                                <Setter Property="ContentTemplate">
                                                    <Setter.Value>
                                                        <dt1 ... />
                                                    </Setter.Value>
                                                </Setter>
                    <DataTrigger Binding="{Binding BooleanDependencyProp}" Value="false">
                                                <Setter Property="ContentTemplate">
                                                    <Setter.Value>
                                                        <dt2 ... />
                                                    </Setter.Value>
                                                </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
    </ContentControl>
</StackPanel>
4

1 回答 1

1

这是 WPF 框架的一个已知缺点,如果您想应用不同的数据模板,请考虑使用可视状态管理器来更改表​​示,或者将内容数据模板换成基于触发器更改的用户控件,你会得到更多的里程。

我可以说的还有很多,但这将涉及了解您的场景以及这些 DataTemplate 中的差异、您为什么要消除歧义等等。还有,MVVM 无处不在?还是带有几个视图模型的直接代码+标记样式?

于 2012-10-08T20:09:55.157 回答