.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
相关产品推荐
相关产品推荐

