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