2012-10-16 34 views
0

我想爲多個DataTemplate設置一個DataTrigger,但我不確定是否有辦法做到這一點? 我已經視圖結構類似於下面如何爲多個DataTemplate使用相同的DataTrigger?

<ItemsControl ItemsSource="{Binding Collection}" 
       AlternationCount="2" 
       ItemTemplateSelector="{StaticResource RowSelector}" > 
<local:HeaderTemplateSelector x:Key="RowSelector" 
      NormalTemplate="{StaticResource NormalTemplate}" 
      ExpanderTemplate1="{StaticResource ExpanderTemplate1}" 
      ExpanderTemplate2="{StaticResource ExpanderTemplate2}" 
      ExpanderTemplate3="{StaticResource ExpanderTemplate3}" /> 
<DataTemplate x:Key="NormalTemplate" ...> 
    <stackpanel x:Name="main" 
<DataTemplate x:Key="ExpanderTemplate1" ...> 
    <Grid x:Name="main" ..> 
<DataTemplate x:Key="ExpanderTemplate2" ...> 
    <Expander x:Name="main" 
<DataTemplate x:Key="ExpanderTemplate3" ...> 
    <Textblock x:Name="main" ...> 

我想要這個數據觸發器提供的行替代背景中,觸發定義下面

<DataTemplate.Triggers> 
    <Trigger Property="ItemsControl.AlternationIndex" Value="0"> 
     <Setter Property="Background" Value="Blue" TargetName="main"/> 
    </Trigger> 
    <Trigger Property="ItemsControl.AlternationIndex" Value="1"> 
     <Setter Property="Background" Value="black" TargetName="main"/> 
    </Trigger> 
</DataTemplate.Triggers> 

我可以將它添加到每個DataTemplate中的端部和它的工作原理好,但這意味着我必須複製一些代碼4次,有什麼辦法可以避免這種情況嗎? (我知道我可以使用數據網格,但它是矯枉過正這種簡單的結構)

+0

也許這是一個副本:http://stackoverflow.com/questions/4443600/is-there-a-way-to-use-data-template-inheritance-in-wpf – Vlad

+0

也許你可以添加觸發器一種風格,而不是模板?您可以重新使用該風格或基於新的風格。 – Vlad

+0

我不知道在這裏應用樣式的任何方式,因爲觸發器基於「ItemsControl.AlternationIndex」設置背景,所以在這種情況下,我可以在哪裏應用樣式? –

回答

3

你可以嘗試設置與風格觸發:

<Style TargetType="Panel" x:Key="AlternatelyPainted"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}" Value="0"> 
      <Setter Property="Background" Value="Red"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}" Value="1"> 
      <Setter Property="Background" Value="Blue"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

(代碼this answer謝天謝地被盜),並在使用它你模板:

<DataTemplate x:Key="NormalTemplate" ...> 
    <StackPanel Style="{StaticResource AlternatelyPainted}"> 
     ... 
    </StackPanel> 
</DataTemplate> 

編輯:如果你想要的風格是普遍的,不Panel特異性,你可以試試下面的TR ick:

<Style x:Key="AlternatelyPainted"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}" Value="0"> 
      <Setter Property="Panel.Background" Value="Red"/> 
      <Setter Property="Control.Background" Value="Red"/> 
      <Setter Property="TextBlock.Background" Value="Red"/> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}" Value="1"> 
      <Setter Property="Panel.Background" Value="Blue"/> 
      <Setter Property="Control.Background" Value="Blue"/> 
      <Setter Property="TextBlock.Background" Value="Blue"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

(刪除了TargetType並將明確的類型添加到屬性名稱)。請注意,TextBlock不會繼承它的Background,所以我們需要額外的一行。

+0

堆棧面板和網格以及其他面板類型元素都可以。但是這個有問題,類型應該總是面板,在我的情況下不是這樣,我有不同的類型,包括像「Expander」和「Textblock」這樣的控件!但是我可以將它們包裝在面板中,至少作爲臨時解決方案,這好比重複,謝謝。 –

+0

@Fred:好的,再試一次 – Vlad

+0

這有助於我的特殊情況,但我想知道爲什麼不能設置類似觸發器屬性的樣式? –

相關問題