CheckBox ListView控件选择

时间:2014-04-07 07:54:31

标签: wpf listview mvvm

我遵循MVVM模式。我有一个listview控件,它有多个复选框。 我的viewmodel有一个Student的集合,它与listview控件有关。

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

viewmodel对该视图一无所知,因此无法访问listview控件

我尝试通过下面的

定义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中执行一些操作。 怎么能实现这个?这是定义上述类的正确方法吗?

1 个答案:

答案 0 :(得分:0)

您的Student类知道其值何时发生变化,因此您只需要在视图模型中的PropertyChanged个对象集合中添加Student处理程序。这样,当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<T>类并覆盖AddInsertRemove方法以及构造函数。


更新&gt;&gt;&gt;

扩展上面的最后一段,你可以扩展ObservableCollection<T>类并覆盖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;