4

私はListViewを次のように宣言しています:

<ListView x:Name="Tree"
      ItemsSource="{Binding ElementName=This, Path=Some.Path.Values}"
      AlternationCount="2"
      ScrollViewer.CanContentScroll="False">

と定義されたスタイル

<UserControl.Resources>
<Style TargetType="ListViewItem">
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="SteelBlue"/>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Gray"/>
    </Style.Resources>
    <Style.Triggers>
        <Trigger Property="ItemsControl.AlternationIndex" Value="0">
            <Setter Property="Background" Value="White" />
        </Trigger>
        <Trigger Property="ItemsControl.AlternationIndex" Value="1">
            <Setter Property="Background" Value="GhostWhite" />
        </Trigger>
    </Style.Triggers>
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Top" />
    <EventSetter Event="Loaded" Handler="ContinueLoading" />
</Style>

この組み合わせにより、元の望ましい動作が生成されました。これは、背景のハイライトを交互に表示する動作です。新しい望ましい動作は、特定のListViewアイテムのプロパティの値に応じてその背景色を変更することでした。そのため、Style.Triggersに変更されました

<Style.Triggers>
    <Trigger Property="ItemsControl.AlternationIndex" Value="0">
        <Setter Property="Background" Value="White" />
    </Trigger>
    <Trigger Property="ItemsControl.AlternationIndex" Value="1">
        <Setter Property="Background" Value="GhostWhite" />
    </Trigger>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}" Value="0"/>
            <Condition Binding="{Binding Converter={x:Static controls:Converters.ObjectType}}" Value="{x:Type client:DocumentEntryTypeA}" />
        </MultiDataTrigger.Conditions>
        <Setter Property="Background" Value="{Binding Converter={x:Static controls:Converters.LightColor}, UpdateSourceTrigger=PropertyChanged, Path=Status}" />
    </MultiDataTrigger>
    <MultiDataTrigger>
        <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}" Value="1"/>
            <Condition Binding="{Binding Converter={x:Static controls:Converters.ObjectType}}" Value="{x:Type client:DocumentEntryTypeA}" />
        </MultiDataTrigger.Conditions>
        <Setter Property="Background" Value="{Binding Converter={x:Static controls:Converters.DarkColor}, UpdateSourceTrigger=PropertyChanged, Path=Status}" />
    </MultiDataTrigger>
</Style.Triggers>
</UserControl.Resources>

ConverterはObjectType、要素が特定のクラスに属していることを確認します。LightColorおよびConvertersはDarkColor、プロパティの値に応じて、選択されたバックグラウンド値を生成しStatusます。

このコードの問題は、私が使用するバインディングが常にAlternationIndex「0」の値を生成するように見えることです。つまり、ConverterLightColorがすべてのエントリに使用されます。上記のコードに加えて、次のバインディングも試しましたが、同じ結果になりました。

<Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}, Path=AlternationIndex}" Value="0"/>
<Condition Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListView}}, Path=(ItemsControl.AlternationIndex)}" Value="0"/>

私が見た例に基づくと、ほとんどのソリューションはスタイルをオブジェクトから分離していません。私の場合、スタイルは内で個別に定義されますUserControl.Resources。ただし、Triggerの使用は正常に機能するため、DataTriggerが機能しない理由、またはそれを機能させるために何が必要になるかはわかりません。

4

1 に答える 1

5

の最初の条件は、MultiDataTrigger最新のを見つけて、ContentPresenterにバインドしようとしContentPresenter.ItemsControl.AlternationIndexますがItemsControl.AlternationIndex、の有効なプロパティではありませんContentPresenter

これをに変更して、現在のオブジェクトRelativeSource={RelativeSource Self}のにバインドするようにしてくださいItemsControl.AlternationIndex

于 2012-11-23T16:49:21.697 に答える