You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合模型IsChecked与ListViewItem鼠标悬停切换Image Source?

实现思路与代码示例

你这个需求用IMultiValueConverter完全可行,核心就是把模型的IsChecked属性和ListViewItem的IsMouseOver状态这两个值传入转换器,再根据组合逻辑返回对应的图片源。我给你一步步拆解实现:

1. 实现IMultiValueConverter转换器

首先创建一个转换器类,接收两个输入值:第一个是模型的IsChecked(bool?类型),第二个是ListViewItem的IsMouseOver(bool类型),然后根据四种组合情况返回对应的ImageSource。

using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media.Imaging;

public class CheckedAndMouseOverToImageConverter : IMultiValueConverter
{
    // 定义四个图片路径,你可以替换成自己的资源路径
    public string CheckedMouseOverImagePath { get; set; }
    public string CheckedNormalImagePath { get; set; }
    public string UncheckedMouseOverImagePath { get; set; }
    public string UncheckedNormalImagePath { get; set; }

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        // 校验输入值的有效性
        if (values.Length != 2 || 
            !(values[0] is bool? isChecked) || 
            !(values[1] is bool isMouseOver))
        {
            return new BitmapImage(new Uri(UncheckedNormalImagePath));
        }

        // 根据组合逻辑返回对应图片
        bool checkedValue = isChecked ?? false;
        if (checkedValue)
        {
            return isMouseOver 
                ? new BitmapImage(new Uri(CheckedMouseOverImagePath)) 
                : new BitmapImage(new Uri(CheckedNormalImagePath));
        }
        else
        {
            return isMouseOver 
                ? new BitmapImage(new Uri(UncheckedMouseOverImagePath)) 
                : new BitmapImage(new Uri(UncheckedNormalImagePath));
        }
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        // 因为是单向绑定,这里不需要实现返回逻辑
        throw new NotImplementedException();
    }
}

2. 在XAML中配置绑定与转换器

接下来在你的ListView的GridViewColumn里,给Image的Source设置MultiBinding,绑定两个数据源:

  • 第一个是模型的IsChecked属性
  • 第二个是通过RelativeSource找到父级的ListViewItem的IsMouseOver属性
<ListView ItemsSource="{Binding YourItemCollection}">
    <ListView.Resources>
        <!-- 实例化转换器,配置各个状态的图片路径 -->
        <local:CheckedAndMouseOverToImageConverter 
            x:Key="ImageConverter"
            CheckedMouseOverImagePath="/Images/Checked_Hover.png"
            CheckedNormalImagePath="/Images/Checked_Normal.png"
            UncheckedMouseOverImagePath="/Images/Unchecked_Hover.png"
            UncheckedNormalImagePath="/Images/Unchecked_Normal.png"/>
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="状态图标">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Width="20" Height="20">
                            <Image.Source>
                                <MultiBinding Converter="{StaticResource ImageConverter}">
                                    <!-- 绑定模型的IsChecked属性 -->
                                    <Binding Path="IsChecked"/>
                                    <!-- 绑定父级ListViewItem的IsMouseOver状态 -->
                                    <Binding RelativeSource="{RelativeSource AncestorType=ListViewItem}" Path="IsMouseOver"/>
                                </MultiBinding>
                            </Image.Source>
                        </Image>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <!-- 其他列... -->
        </GridView>
    </ListView.View>
</ListView>

关键注意点

  • 确保RelativeSource的AncestorType设置正确,这里必须是ListViewItem,因为我们要获取的是列表项的鼠标悬停状态
  • 转换器里要处理IsChecked为null的情况(比如bool?类型的默认值),避免空引用异常
  • 图片路径要根据你的项目结构调整,建议使用项目资源或者绝对路径

这样就能同时根据模型的选中状态和列表项的鼠标悬停状态,动态切换Image的Source了。

内容的提问来源于stack exchange,提问作者Danny Nitman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:37:11