You need to enable JavaScript to run this app. 如何在WPF MVVM模式下绑定WPFToolkit CheckListBox的勾选/选中项
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 06:24:04