将 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