INotifyPropertyChanged WPF

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了INotifyPropertyChanged WPF相关的知识,希望对你有一定的参考价值。

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

这里是实现INotifyPropertyChanged事件的我的Customer类:

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或空时,如何在UI上显示MessageBox。

答案

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

视图仅预订该事件-告诉它所有必要的信息。该事件包括更改后的属性的名称,因此,如果UI元素绑定到该属性,它将更新。

另一答案

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

另一答案

编辑:我重新阅读了您的问题和您的一些评论。这是一种利用客户对象上的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
        }
    }
}
另一答案

我的选项:(My project

#region PropertyChanged

public event PropertyChangedEventHandler PropertyChanged;
private void PCh([CallerMemberName] String propertyName = "")
{
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

#endregion

以上是关于INotifyPropertyChanged WPF的主要内容,如果未能解决你的问题,请参考以下文章

INotifyPropertyChanged 订阅自我

INotifyPropertyChanged的作用

INotifyPropertyChanged WPF

INotifyPropertyChanged 和 DependencyProperty 有啥关系?

为嵌套(子)对象订阅 INotifyPropertyChanged

为啥 ViewModel 应该实现 INotifyPropertyChanged?