0

複数の 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 回複製する必要があることを意味します。それを回避する方法はありますか? (データグリッドを使用できることはわかっていますが、この単純な構造にはやり過ぎです)

4

1 に答える 1

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>

(この回答からありがたいことに盗まれたコード)そしてあなたのテンプレートでそれを使用してください:

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

編集:スタイルを特定のものではなく普遍的なものにしたい場合はPanel、次のトリックを試すことができます:

<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ため、追加の行が必要です。

于 2012-10-16T17:17:34.840 に答える