【问题标题】:WPF: Combine DataTrigger with IsMouseOverWPF:将 DataTrigger 与 IsMouseOver 结合使用
【发布时间】:2017-12-01 09:11:55
【问题描述】:

这是我的绑定数据:

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 中并且不会像在我的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>

但这仍然无法按预期工作。

【问题讨论】:

    标签: wpf triggers datatrigger


    【解决方案1】:

    将您的触发器保存在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"/>
    

    【讨论】:

    • 我需要在哪里添加您的示例?IsOK 也是属性。
    • 显然在&lt;GridViewColumn.CellTemplate&gt;。我在你的代码中看到了唯一的 TextBlock,所以没有很多地方可以插入它:)
    • 这仍然没有帮助,前台仍然没有改变
    • 您是否从CellTemplate DataTemplateTextBlock Style 中删除了所有触发器?放置所有将Foreground 更改为ItemContainerStyle 的触发器。 IsMouseOver 触发器也应该是触发器集合中的最后一个。
    猜你喜欢
    • 2010-10-10
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2020-08-14
    • 2015-11-03
    • 2012-07-11
    • 2010-12-10
    相关资源
    最近更新 更多