我遇到了DataTriggers中的一个问题,我正在使用它来为节点的ObservableCollection选择一个DataTemplate。
“我的窗口”有一个链接到ViewModel的DataContext,该模型包含一个NodeVM的ObservableCollection(称为OptionNodes),它具有NodeValid属性
我正在显示ItemsControl中的节点列表,并想根据NodeValid Propety的值选择DataTemplate,因此正在研究使用DataTriggers。
但是,DataTrigger正在查找链接到Windows DataContext的VM,而不是Observable集合中的VM
这是我正在使用的XAML
<ItemsControl ItemsSource="{Binding OptionNodes}" >
<ItemsControl.ItemsPanel>
<itemspaneltemplate>
<WrapPanel Orientation="Horizontal" />
</itemspaneltemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Style>
<Style TargetType="ItemsControl">
<Setter Property="ItemTemplate" Value="{StaticResource NodeTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=NodeValid}" Value="false">
<Setter Property="ItemTemplate" Value="{StaticResource BlankNodeTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.Style>
</ItemsControl>
编辑:
重定向到here后,我发现虽然没有对我的问题的解释,但是所提供的代码使我能够将XAML更改为有效的代码。
<ItemsControl ItemsSource="{Binding OptionNodes}" >
<ItemsControl.ItemsPanel>
<itemspaneltemplate>
<WrapPanel Orientation="Horizontal" />
</itemspaneltemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="ContentTemplate" Value="{StaticResource NodeTemplate}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path=NodeValid}" Value="false">
<Setter Property="ContentTemplate" Value="{StaticResource BlankNodeTemplate}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
这使我想了解ItemsTemplate和ContentTemplate之间的区别,答案here基本上是说ItemsTemplate适用于集合中的所有项目,而ContentTemplate适用于单个项目。这意味着我的原始代码将无法工作,因为整个集合只能使用一个ItemTemplate,而使用Content模板意味着我可以将单个DataTemplate设置为集合中的不同Item