如何在WPF MVVM模式下绑定WPFToolkit CheckListBox的勾选/选中项
实现步骤
1. 修正Model类
你当前的Model类缺少和CheckedMemberPath对应的IsChecked属性,且SelectedSiteList属于全局选中集合,不应该放在单个站点项的Model里。调整后代码如下:
public class Model : INotifyPropertyChanged { private string _SiteName; public string SiteName { get { return _SiteName; } set { _SiteName = value; OnPropertyChanged(nameof(SiteName)); } } // 新增和CheckedMemberPath绑定的选中状态属性 private bool _IsChecked; public bool IsChecked { get { return _IsChecked; } set { _IsChecked = value; OnPropertyChanged(nameof(IsChecked)); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
2. 修正ViewModel类
首先修正SiteList的类型错误,新增SelectedSiteList属性,并且监听每个站点项的选中状态变化,实时更新选中的站点列表:
class ViewModel : INotifyPropertyChanged { private ObservableCollection<Model> _SiteList; // 修正原代码的类型错误,和定义的Model类保持一致 public ObservableCollection<Model> SiteList { get { return _SiteList; } set { _SiteList = value; OnPropertyChanged(nameof(SiteList)); } } private List<string> _SelectedSiteList; public List<string> SelectedSiteList { get { return _SelectedSiteList; } set { _SelectedSiteList = value; OnPropertyChanged(nameof(SelectedSiteList)); } } public ViewModel() { SiteList = new ObservableCollection<Model>(); PoppulateSiteNames(); // 给所有站点项绑定属性变化监听 foreach (var item in SiteList) { item.PropertyChanged += SiteItem_PropertyChanged; } // 初始化选中列表 UpdateSelectedSiteList(); } private void SiteItem_PropertyChanged(object sender, PropertyChangedEventArgs e) { // 仅当选中状态变化时更新选中列表 if (e.PropertyName == nameof(Model.IsChecked)) { UpdateSelectedSiteList(); } } private void UpdateSelectedSiteList() { // 提取所有选中项的站点名组成列表 SelectedSiteList = SiteList.Where(x => x.IsChecked) .Select(x => x.SiteName) .ToList(); } private void PoppulateSiteNames() { Dictionary<string, string> keyValuePairs = Files.ReadIni_KeyValue("SiteSection"); foreach (string Key in keyValuePairs.Keys) { if (keyValuePairs.TryGetValue(Key, out string LogTable)) { // 如需默认选中某个项,可在这里给IsChecked赋值为true SiteList.Add(new Model() { SiteName = LogTable }); } } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
3. XAML和上下文绑定配置
你原有XAML代码无需修改,只要给MainWindow绑定正确的DataContext即可,无需编写任何后台事件代码:
// MainWindow构造函数 public MainWindow() { InitializeComponent(); this.DataContext = new ViewModel(); }
后续业务逻辑需要使用选中站点时,直接访问ViewModel的SelectedSiteList属性即可。
补充说明:如果你的SiteList会在运行时动态添加/删除项,需要额外订阅SiteList的CollectionChanged事件,给新增项绑定PropertyChanged监听、给移除项取消监听,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Satyavan Choure
相关产品推荐
相关产品推荐

