我有一个 ListView 声明为:
<ListView x:Name="Tree"
ItemsSource="{Binding ElementName=This, Path=Some.Path.Values}"
AlternationCount="2"
ScrollViewer.CanContentScroll="False">
Run Code Online (Sandbox Code Playgroud)
和定义为的样式
<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>
Run Code Online (Sandbox Code Playgroud)
这种组合产生了最初所需的行为,即交替背景高光的行为。新的期望行为是根据给定 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>
Run Code Online (Sandbox Code Playgroud)
该ObjectType转换器将检查的元件是一个给定的类的; 的LightColor和DarkColor转换器根据所述的值产生选择的背景值Status属性。
这段代码的问题是我使用的绑定似乎总是产生AlternationIndex值“0”,即每个条目都使用 Converter LightColor。除了上面的代码,我还尝试了以下绑定,结果相同:
<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"/>
Run Code Online (Sandbox Code Playgroud)
根据我见过的示例,大多数解决方案都没有将样式与对象分开;在我的情况下,样式是在UserControl.Resources. 但是,由于使用触发器工作正常,我不确定为什么 DataTrigger 不能,或者需要什么才能让它工作。
您中的第一个条件MultiDataTrigger查找最新的ContentPresenter,并尝试绑定到ContentPresenter.ItemsControl.AlternationIndex,并且ItemsControl.AlternationIndex不是 的有效属性ContentPresenter。
尝试将其更改为RelativeSource={RelativeSource Self}这样您将绑定到ItemsControl.AlternationIndex当前对象的
| 归档时间: |
|
| 查看次数: |
1213 次 |
| 最近记录: |