触发的内容模板

时间:2012-01-16 21:24:09

标签: c# wpf xaml .net-4.0 triggers

我正在尝试设置一个基于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中具有完全不同的(空)控件模板。

有关如何设置此触发器的任何想法?

1 个答案:

答案 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>