Xamarin ListView 实现全选复选框同步更新UI问题求助
问题根源
Company模型类的IsChecked属性未实现属性变更通知,修改值后UI无法收到更新通知,所以不会刷新- 全选复选框缺少对应的绑定属性和状态同步逻辑
修改步骤
1. 调整Company模型类
让Company继承BaseViewModel,修改IsChecked属性实现变更通知:
public class Company : BaseViewModel { private bool _isChecked; public bool IsChecked { get => _isChecked; set => SetProperty(ref _isChecked, value); } // 其他原有属性(Name等)保留即可 }
2. SyncViewModel增加全选控制属性
新增IsSelectAll属性,值变更时同步所有列表项的选中状态:
public class SyncViewModel : BaseViewModel { private bool _isSelectAll; public bool IsSelectAll { get => _isSelectAll; set { if (SetProperty(ref _isSelectAll, value)) { foreach (var company in CompaniesCollection) { company.IsChecked = value; } } } } // 原有代码保持不变 }
3. 修改XAML全选复选框绑定
移除原来的CheckedChanged事件,绑定到新增的IsSelectAll属性:
<CheckBox x:Name="SelectAll" Color="Blue" IsChecked="{Binding IsSelectAll}" />
可选:实现子项反向同步全选框
如果需要实现手动选中所有子项时自动勾选全选框、取消任意子项时自动取消全选框的效果,在SyncViewModel中新增子项属性变更监听逻辑:
public async Task InitializeData() { var wellDataStore = new WellDataStore(); var companies = await wellDataStore.GetAllGroups(); if (companies != null) { CompaniesCollection.Clear(); foreach (var company in companies) { company.PropertyChanged += OnCompanyPropertyChanged; CompaniesCollection.Add(company); } } } private void OnCompanyPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(Company.IsChecked)) { IsSelectAll = CompaniesCollection.All(c => c.IsChecked); } }
优化提示
如果CompaniesCollection会动态增删项,需要额外监听ObservableCollection的CollectionChanged事件,给新增的项绑定PropertyChanged监听、给移除的项解绑监听,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Raluca Micu
相关产品推荐
相关产品推荐

