【问题标题】:CheckBox ListView control selectionCheckBox ListView 控件选择
【发布时间】:2014-04-07 18:16:43
【问题描述】:

我正在遵循 MVVM 模式。我有一个列表视图控件,它有多个复选框。 我的 viewmodel 有 Student 的集合,这些集合绑定到 listview 控件。

public ObservableCollection<Student> students{ get; private set; }
private ObservableCollection<Student> _displays { get; set; }

viewmodel 对视图一无所知,因此它无法访问列表视图控件

我尝试通过下面定义 Student 类

public class Student: INotifyPropertyChanged
{
    public string Name{ get; set; }
    public string class { get; set; }

    //Provide change-notification for IsSelected
    private bool _fIsSelected = false;
    public bool IsSelected
    {
        get { return _fIsSelected; }
        set
        {
            _fIsSelected = value;
            this.OnPropertyChanged("IsSelected");
        }
    }
}

现在我想在用户选择/取消选择复选框时在 viewmodel 中执行一些操作。 怎么能做到这一点?定义上述类的方法是否正确?

【问题讨论】:

  • 为什么不使用复选框的树形视图? Treeview 具有属性复选框 - 您必须将其设置为 true,然后您有 AfterCheck 事件。有意义吗?

标签: wpf listview mvvm


【解决方案1】:

您的Student 类知道它的值何时发生变化,因此您只需在视图模型中的Student 对象集合中添加一个PropertyChanged 处理程序。这样,当Student 类的值发生变化时,您的视图模型可以得到通知。试试这样的:

foreach (Student student in students)
{
    student.PropertyChanged += Item_PropertyChanged;
}

...

private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "IsSelected")
    {
        // The IsSelected property was changed
    }
}

请注意,您必须为集合中的每个 项添加一个处理程序。您可以在循环中执行此操作,如上所示,或者通过扩展ObservableCollection&lt;T&gt; 类并覆盖AddInsertRemove 方法和构造函数。


更新>>>

从上面扩展我的最后一段,您可以扩展 ObservableCollection&lt;T&gt; 类并覆盖 AddRemove 方法和构造函数...在最基本的情况下,您可以执行以下操作:

public class Students : ObservableCollection<Student>
{
    public Students(IEnumerable<Student> students)
    {
        foreach (Student student in students) Add(student);
    }

    public new void Add(T item)
    {
        item.PropertyChanged += Item_PropertyChanged;
        base.Add(item);
    }

    public new bool Remove(T item)
    {
        item.PropertyChanged -= Item_PropertyChanged;
        return base.Remove(item);
    }

    private void Item_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        // Notify of all item property changes
        NotifyPropertyChanged(e.PropertyName);
    }

    // Implement the INotifyPropertyChanged interface properly here
}

这种方法的好处是您可以将一个处理程序附加到集合中,而不必手动将它们附加到每个项目:

Students.PropertyChanged += Item_PropertyChanged;

【讨论】:

  • 您能否详细说明如何以另一种方式执行此操作,即通过扩展 ObservationCollection 类并覆盖 add 和 remove 方法。
猜你喜欢
  • 2011-03-31
  • 2015-02-17
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 2010-10-03
  • 2013-01-08
  • 1970-01-01
相关资源
最近更新 更多