WPF:将DataTrigger与IsMouseOver结合使用

时间:2017-06-28 06:29:37

标签: wpf triggers datatrigger

这是我的绑定数据:

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(格式列)标记为红色,但如果IsMouseIsOvertrue,则此column仍在Silver而不会成为{ {1}}在我的White中定义。

所以我将trigger更改为:

GridViewColumn

但这仍然无法正常运作。

1 个答案:

答案 0 :(得分:1)

将您的触发器保留在ItemContainerStyle中。只需将Foreground绑定添加到TextBlock即可从ListViewItem&#39; Foreground获取前景画笔。

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