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

.NET MAUI中ListView指定单元格背景色修改问题

.NET MAUI ListView点击单元格修改背景色解决方案

直接通过数据绑定+状态管理的方式实现,避免直接操作ListView的视图对象(因单元格复用机制,直接操作视图会导致状态混乱)。

步骤1:修改Item类,添加选中状态属性

给Item类实现INotifyPropertyChanged接口,新增IsSelected属性用于标记选中状态:

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class Item : INotifyPropertyChanged
{
    public string Name { get; set; }
    public string Description { get; set; }
    public string Id { get; set; }

    private bool _isSelected;
    public bool IsSelected
    {
        get => _isSelected;
        set
        {
            if (_isSelected != value)
            {
                _isSelected = value;
                OnPropertyChanged();
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

步骤2:修改ListView的ItemTemplate,绑定背景色

在创建ViewCell时添加数据触发器,根据IsSelected属性切换背景色:

this.list = new ListView
{
    ItemsSource = new ObservableCollection<Item>(Lists.Items),
    ItemTemplate = new DataTemplate(() =>
    {
        // 保留你原有的Label、Button、Grid创建代码
        
        Grid templateLayout = new Grid
        {
            // 保留你原有的Grid布局代码
        };
        // 保留你原有的控件添加代码
        
        // 创建ViewCell并添加状态触发器
        var viewCell = new ViewCell { View = templateLayout };

        // 选中状态触发器
        var selectedTrigger = new DataTrigger(typeof(ViewCell))
        {
            Binding = new Binding(nameof(Item.IsSelected)),
            Value = true
        };
        selectedTrigger.Setters.Add(new Setter
        {
            Property = ViewCell.BackgroundColorProperty,
            Value = Colors.LightBlue // 自定义选中背景色
        });

        // 默认状态触发器
        var defaultTrigger = new DataTrigger(typeof(ViewCell))
        {
            Binding = new Binding(nameof(Item.IsSelected)),
            Value = false
        };
        defaultTrigger.Setters.Add(new Setter
        {
            Property = ViewCell.BackgroundColorProperty,
            Value = Colors.Transparent // 自定义默认背景色
        });

        viewCell.Triggers.Add(selectedTrigger);
        viewCell.Triggers.Add(defaultTrigger);

        return viewCell;
    })
};

步骤3:修改ItemTapped事件,管理选中状态

在点击事件中切换当前项和上一项的IsSelected状态,确保只有点击的单元格变色:

private Item _lastSelectedItem;

// 绑定事件(保留你原有的代码)
list.ItemTapped += OnItemTapped;

private void OnItemTapped(object sender, ItemTappedEventArgs e) 
{
    if (e.Item is Item currentItem)
    {
        // 取消上一个选中项的状态
        _lastSelectedItem?.IsSelected = false;
        // 设置当前项为选中状态
        currentItem.IsSelected = true;
        _lastSelectedItem = currentItem;

        // 可选:取消ListView内置的选中高亮(如果不需要)
        ((ListView)sender).SelectedItem = null;
    }
}

原理说明

ListView的单元格采用复用机制,直接查找视图对象会导致滚动时状态错乱。通过绑定IsSelected属性+数据触发器的方式,让UI状态由数据驱动,既符合MAUI的设计思想,又能避免复用带来的问题。

内容的提问来源于stack exchange,提问作者Gael Pinto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 20:24:55