【问题标题】:Bind CheckListBox to ViewModel将 CheckListBox 绑定到 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>

【问题讨论】:

    标签: c# wpf xaml mvvm data-binding


    【解决方案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 属性,它会起作用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2016-10-11
    • 2012-03-18
    相关资源
    最近更新 更多