INotifyPropertyChanged WPF

Posted

技术标签:

【中文标题】INotifyPropertyChanged WPF【英文标题】: 【发布时间】:2021-09-07 10:20:36 【问题描述】:

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

这是实现 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 或空分配给名字一样,我如何在 UI 上显示 MessageBox。

【问题讨论】:

【参考方案1】:

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

视图只是订阅事件 - 它告诉它所有必要的事情。该事件包含已更改属性的名称,因此如果 UI 元素绑定到该属性,它会更新。

【讨论】:

【参考方案2】:

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

【讨论】:

我知道由于 INotifyPropertyChanged 接口而更新 UI,但是如何根据 FirstName 为 null 或空的事实更改 UI 上的某些内容。 如果您真的不想将自己附加到事件中并以命令式的方式做您想做的事情,您可以通过以下组合以声明方式执行它,例如用于字符串的转换器 -> bool 封装您的逻辑,然后使用生成的 bool 驱动一些 Visibility 属性。但是,我看不到如何从 XAML 中弹出 MessageBox。【参考方案3】:

编辑:我重读了您的问题和您的一些 cmets。这是一个使用 DataContextChanged 事件和 Customer 对象上的 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
        
    

【讨论】:

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

INotifyPropertyChanged 订阅自我

INotifyPropertyChanged的作用

INotifyPropertyChanged WPF

INotifyPropertyChanged 和 DependencyProperty 有啥关系?

为嵌套(子)对象订阅 INotifyPropertyChanged

为啥 ViewModel 应该实现 INotifyPropertyChanged?