这是我的ViewModel -
public class ViewModel
{
public ObservableCollection<Person> Persons { get; set; }
}
这是Class Person:
public class Person : INotifyPropertyChanged
{
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
现在,每当其中一个人的FirstName正在改变时,我想做一些任务, 让我们说提出一个消息框。
我该怎么做?
答案 0 :(得分:1)
您需要实施INotifyPropertyChanged
public class Person : INotifyPropertyChanged
{
private string firstName;
public string FirstName
{
get { return this.firstName;}
set
{
this.firstName = value;
this.RaisePropertyChanged("FirstName");
MessageBox.Show("Hello World");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null))
{
propertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
答案 1 :(得分:1)
通常,您的person类将使用接口INotifyPropertyChanged,每当FirstName更改时触发PropertyChanged事件。这允许您将视图中的项绑定到Person类,并在数据更改时更新视图。
要在任何FirstName时弹出消息框,您需要在视图中隐藏一些代码。一种方法是,像以前一样,使用INotifyProperty更改并在视图中的所有Person对象上订阅,使用MessageBox.Show,只要调用更改FirstName的事件。您可以使用ObservableCollection中的CollectionChanged事件来跟踪列表中的Person对象,以确保它们都连接到Person FirstName更改的事件处理程序。
在我看来,最好的方法是在ViewModel中有一个事件而不是每当对任何Person类进行更改时触发的Person类(以特定的Person对象作为参数)。这只有在ViewModel是唯一可以更改Person.FirstName的东西时才有效,并且您的View必须以适当的方式绑定到ViewModel以实现此目的。
答案 2 :(得分:0)
您需要在viewmodel上实现INotifyPropertyChanged,并在设置人员集合时引发属性更改事件。这样你就可以听到它已经改变的事实。
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx