INotifyPropertyChanged WPF

时间:2009-06-24 16:37:59

标签: wpf inotifypropertychanged

INotifyPropertyChanged的目的是什么?我知道每当更改属性时都会触发此事件,但View / UI如何知道此事件被触发:

这是我的Customer类,它实现了INotifyPropertyChanged事件:

public class Customer : INotifyPropertyChanged
    {
        private string _firstName;

        public string LastName { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            if(PropertyChanged != null)
                PropertyChanged(this,new PropertyChangedEventArgs(propertyName));

        }

        public string FirstName
        {
            get { return _firstName; }

            set
            {
                _firstName = value;
                OnPropertyChanged("FirstName");
            }
        }
    }

但现在如何通知UI该属性已更改。就像用户为第一个名称指定null或empty一样,我如何在UI上显示MessageBox。

3 个答案:

答案 0 :(得分:5)

INotifyPropertyChanged允许WPF UI元素(通过标准数据绑定机制)订阅PropertyChanged事件并自动更新。例如,如果您有一个TextBlock显示您的FirstName属性,通过使用INotifyPropertyChanged,您可以在表单上显示它,并且当代码中的FirstName属性更改时它将自动保持最新。

View只是订阅了这个事件 - 告诉它必要的一切。该事件包含已更改属性的名称,因此如果UI元素绑定到该属性,则会更新。

答案 1 :(得分:3)

WPF可以知道,因为它可以检查对象是否实现了此接口,然后将对象强制转换为所述接口并注册该事件。然后,它可以触发绑定基础结构来更新显示。如果你想做出反应,你可以为同一事件注册自己。

答案 2 :(得分:3)

编辑:我重读了你的问题以及你的一些评论。以下是使用Customer对象上的DataContextChanged事件和INotifyPropertyChanged接口的可能解决方案。您还应该查看WPF和.Net 3.5中的Data Binding Validation

<TextBox Text="{Binding FirstName}" />

// assuming:
// myWindow.DataContext = new Customer();
myWindow.DataContextChanged += MyWindow_DataContextChanged;

private void MyWindow_DataContextChanged(object sender,
    DependencyPropertyChangedEventArgs e)
{
    var oldCustomer = e.OldValue as Customer;
    if (oldCustomer != null)
    {
        oldCustomer.PropertyChanged -= Customer_CheckProps;
    }

    var newCustomer = e.NewValue as Customer;
    if (newCustomer != null)
    {
        newCustomer.PropertyChanged += Customer_CheckProps;
    }
}

private void Customer_CheckProps(object sender, PropertyChangedEventArgs e)
{
    var customer = sender as Customer;
    if (customer != null)
    {
        if (e.PropertyName == "FirstName"
            && String.IsNullOrEmpty(customer.FirstName))
        {
            // Display Message Box
        }
    }
}