WPF:将 DataTrigger 与 IsMouseOver 相结合



这是我的绑定数据:

List<MyData> files;
public clas MyData
{
public string Name { get; set; }    // Column
public bool IsOK { get; set; }     // Not a Column
public string Format { get; set; }  // Column
}

我的ListView

<ListView
Grid.Row="0"
Name="lvFiles"
ItemsSource="{Binding wiresharkFiles}">
<ListView.ItemContainerStyle>
<DataTrigger Binding="{Binding IsOK}" Value="True">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="White"></Setter>
<Setter Property="Background" Value="Green"/>
</MultiTrigger>
</ListView.ItemContainerStyle>

我有几个ListViewColumns,因为我想只更改名称列的颜色,我将其添加到我的其他列(格式列)GridViewColumn

<GridViewColumn Width="115" Header="Format">
<GridViewColumn.CellTemplate>                                    
<DataTemplate>
<TextBlock 
x:Name="textBlock"
Text="{Binding FileFormat}"
Margin="0,0,0,0"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding IsOK}" Value="True">
<Setter TargetName="textBlock" Property="Foreground" Value="Silver"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>

这不会将此Column(格式列)标记为红色,但万一IsMouseIsOvertruecolumn仍在Silver中,并且不会像我的trigger中定义的那样变得White

所以我把GridViewColumn改成了这个:

<GridViewColumn Width="115" Header="Format">
<GridViewColumn.CellTemplate>                                    
<DataTemplate>
<TextBlock 
x:Name="textBlock"
Text="{Binding FileFormat}"
Margin="0,0,0,0">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Gray"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding BadCheckSumExist}" Value="True">
<Setter TargetName="textBlock" Property="Foreground" Value="Silver"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>

但这仍然没有按预期工作。

将触发器保留在ItemContainerStyle中。只需将Foreground绑定添加到TextBlock,即可从ListViewItemForeground中获取前景画笔。

<TextBlock x:Name="textBlock"
Text="{Binding FileFormat}"
Foreground="{Binding Path=Foreground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}}"
Margin="0,0,0,0"/>

最新更新