wpf,binding和datacontext

时间:2010-12-14 17:21:42

标签: wpf binding datacontext

这是我的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正在改变时,我想做一些任务, 让我们说提出一个消息框。

我该怎么做?

3 个答案:

答案 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