我有一个名为
ViewModelClass
其中包含一个 bool(boolean) 值。我有另一个 View 模型,其中包含
ObservableCollection<ViewModelClass> m_allProjects;
然后我认为:<DataTemplate>
<views:ProjectInfoView x:Key="ProjectInfoDetailTemplate"/>
</DataTemplate>
<ItemsControl Grid.Row="1" Grid.Column="0"
ItemsSource="{Binding AllProjects}"
ItemTemplate="{StaticResource ProjectInfoDetailTemplate}"
Margin="10,28.977,10,10">
</ItemsControl >
我想基于AllProjects集合中的 bool(boolean) 值,使用其他数据模板。做这个的最好方式是什么?我知道我可以使用不同的ViewModels来执行此操作,并使用一种基于ViewModel的对象,但是我更喜欢仅使用1个 View 模型。
编辑:
我想用数据触发器来做到这一点。有人可以给我一些代码吗?
最佳答案
我通常使用ContentControl
显示数据,并根据更改的属性在触发器中换出ContentTemplate
。
这是我在my blog上发布的一个示例,该示例根据绑定(bind)属性交换模板
<DataTemplate x:Key="PersonTemplate" DataType="{x:Type local:ConsumerViewModel}">
<TextBlock Text="I'm a Person" />
</DataTemplate>
<DataTemplate x:Key="BusinessTemplate" DataType="{x:Type local:ConsumerViewModel}">
<TextBlock Text="I'm a Business" />
</DataTemplate>
<DataTemplate DataType="{x:Type local:ConsumerViewModel}">
<ContentControl Content="{Binding }">
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Setter Property="ContentTemplate" Value="{StaticResource PersonTemplate}" />
<Style.Triggers>
<DataTrigger Binding="{Binding ConsumerType}" Value="Business">
<Setter Property="ContentTemplate" Value="{StaticResource BusinessTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
DataTemplateSelector
也将起作用,但前提是由于DataTemplateSelectors
不响应更改通知,因此决定显示哪个模板的属性没有更改。我通常尽可能避免使用它们,因为我也更喜欢 View 选择逻辑,以便了解发生了什么。关于wpf - 基于成员变量的不同 View /数据模板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10190887/