将 CheckListBox 绑定到 ViewModel

Posted

技术标签:

【中文标题】将 CheckListBox 绑定到 ViewModel【英文标题】:Bind CheckListBox to ViewModel 【发布时间】:2016-11-18 18:19:19 【问题描述】:

我正在使用 WPF Toolkit 中的 CheckListBox 并尝试将其绑定到我的 ViewModel。除了从控件中获取选定的值之外,我还希望能够通过单击按钮来重置它,这将清除所有选择。我被困在如何绑定集合中每个项目的选中或选中状态,但如果我的整个方法都关闭了,我也将不胜感激。

我创建了一个简单的类,其中包含一个字符串描述符和一个布尔属性,我计划用它来指示每个复选框的状态...

public class DrugInfluence : INotifyPropertyChanged

    public string Impairment  get; set; 
    private bool isChecked;

    public bool IsChecked
    
        get  return isChecked; 
        set
        
            if(isChecked != value)
            
                isChecked = value;
                OnPropertyChanged("IsChecked");
            
        
    

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(string info)
    
        if (PropertyChanged != null)
        
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        
    

ViewModel 中名为 ImpairmentList 的 DrugInfluence 对象集合,我想将其绑定到 CheckListBox 控件本身...

    public List<DrugInfluence> ImpairmentList
    
        get
        
            return impairmentList;
        
        set
        
            if(impairmentList != value)
            
                impairmentList = value;
                NotifyPropertyChanged("ImpairmentList");
            
                    
    

还有我用来将 ViewModel 绑定到 CheckListBox 控件的 XAML...

        <sdk:CheckListBox Margin="6"
                          ItemsSource="Binding ImpairmentList"   
                          DisplayMemberPath="Impairment"
                          SelectedMemberPath="IsChecked"
                          SelectedItemsOverride="Binding SelectedImpairments, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged">
        </sdk:CheckListBox>

【问题讨论】:

【参考方案1】:

this 是您使用的控件吗?如果是这样,看起来 SelectedMemberPath 是您要绑定到的属性。如果您想以编程方式检查/取消选中,您还需要在 IsChecked 属性更改时引发事件。例如,

 public class DrugInfluence : INotifyPropertyChanged
    
        public string Impairment  get; set; 

        private bool _isChecked;
        public bool IsChecked 
         
            get return _isChecked;
            set
            
                if (_isChecked!= value)
                
                    _isChecked= value;
                    OnPropertyChanged("IsChecked");
                
            ; 
        
    

然后实现其余的 INotifyPropertyChanged 成员

【讨论】:

是的,这就是控制。至于我的方法,我已经在我的 ViewModel 而不是 DrugInfluence 类本身中实现了 INotifyPropertyChanged,我想我会尝试将 SelectedMemberPath (如你所建议的那样)绑定到我的 ViewModel 中的 DrugInfluence 对象集合的 IsChecked 属性,并且raise 事件通知将得到处理 - 我在这方面做得不够吗? 您还需要在 DrugInfluence 上实现 INotifyPropertyChanged。 ObservableCollection 唯一需要注意的是项目源是否更改(即设置为新列表,或添加/删除项目)。它不会自动处理列表中元素的变化。 通过将 IsChecked 属性绑定到 SelectedMemberPath,您是在告诉 WPF 侦听对该属性的更改。你必须告诉它它已经改变了,它会负责更新 UI。 我已经更新了上面的代码,但是当单击按钮时,我无法通过设置 IsChecked 属性 = false 以编程方式清除复选框。知道我在这里做错了什么吗? 出于好奇,如果您从 xaml 中删除 SelectedItemsOverride 属性,它会起作用吗?

以上是关于将 CheckListBox 绑定到 ViewModel的主要内容,如果未能解决你的问题,请参考以下文章

无法使用MVVM通过Xceed CheckListBox获取SelectedItems

c#wpf 中有没有checklistbox

Xamarin UWP 似乎绑定到错误的视图模型

delphi中 checklistbox怎样根据数据值做出选中或没选中

delphi checklistbox用法

MVVM