2012-01-16 145 views
3

我試圖設置一個基於DataTrigger更改的ContentTemplate。 Syntatically,我覺得這應該工作,但它會導致堆棧溢出試圖渲染頁面時:觸發的內容模板

<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中的非必填字段具有完全不同的(空的)控件模板。

關於如何設置此觸發器的任何想法?

回答

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>