我遵循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中执行一些操作。 怎么能实现这个?这是定义上述类的正确方法吗?
答案 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>
类并覆盖Add
,Insert
和Remove
方法以及构造函数。
更新&gt;&gt;&gt;
扩展上面的最后一段,你可以扩展ObservableCollection<T>
类并覆盖Add
和Remove
方法以及构造函数......最基本的,你可以做像这样的东西:
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;