3

INotifyPropertyChanged 的​​目的是什么。我知道每当更改属性时都会触发此事件,但是 View/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。

4

3 回答 3

5

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

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

于 2009-06-24T16:42:48.353 回答
3

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

于 2009-06-24T16:41:55.763 回答
3

编辑:我重读了您的问题和您的一些评论。这是一个可能的解决方案,在您的 Customer 对象上使用DataContextChanged事件和 INotifyPropertyChanged 接口。您还应该查看WPF 和 .Net 3.5 中的数据绑定验证

<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
        }
    }
}
于 2009-06-24T16:42:07.650 回答