我正在尝试设置一个基于DataTrigger更改的ContentTemplate。从语法上讲,我觉得这应该可行,但在尝试渲染页面时会导致堆栈溢出:
<ItemsControl ItemsSource="{Binding Path=ExtendedFieldCollection}" ItemTemplate="{StaticResource RequiredFieldsTemplate}" />
<!--Where-->
<DataTemplate x:Key="RequiredFieldsTemplate">
<ContentPresenter>
<ContentPresenter.Style>
<Style TargetType="ContentPresenter">
<Setter Property="ContentTemplate" Value="{x:Null}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsRequired}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource MyFieldDisplayTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentPresenter.Style>
</ContentPresenter>
</DataTemplate>
简单地走
<DataTemplate x:Key="RequiredFieldsTemplate">
<ContentPresenter ContentTemplate="{StaticResource MyFieldDisplayTemplate}" />
工作正常 - 但我想要完成的是绑定到字段列表,但只显示必填字段。我不能只使用Visibility = collapsed,实例化MyFieldDisplayTemplate
中的所有自定义控件会产生巨大的开销。我的目标是让非必需字段在ItemsControl中具有完全不同的(空)控件模板。
有关如何设置此触发器的任何想法?
答案 0 :(得分:8)
我想通过绊倒这个问题来解决这个问题:WPF: How to set the data template trigger for content control?
我应该使用ContentControl - 而不是ContentPresenter。奇怪的是,当你以一种方式使用它们时,两者的行为相同,但是当你想要使用触发器时则完全不同。要一如既往地学习。
<DataTemplate x:Key="RequiredFieldsTemplate">
<ContentControl>
<ContentControl.Style>
<Style TargetType="ContentPresenter">
<Setter Property="ContentTemplate" Value="{x:Null}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsRequired}" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource MyFieldDisplayTemplate}" />
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>