INotifyPropertyChanged WPF

3

什么是INotifyPropertyChanged的目的。我知道每当属性更改时,此事件就会触发,但视图/用户界面如何知道已触发此事件:

以下是实现了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上显示一个消息框。

3个回答

5
INotifyPropertyChanged允许WPF UI元素(通过标准的数据绑定机制)订阅PropertyChanged事件并自动更新它们自己。例如,如果您有一个TextBlock显示您的FirstName属性,通过使用INotifyPropertyChanged,您可以在表单上显示它,当FirstName属性在代码中更改时,它将自动保持最新状态。
视图只需订阅事件-这告诉它一切必要的信息。该事件包括更改的属性名称,因此如果UI元素绑定到该属性,则会进行更新。

3

编辑:我重新阅读了您的问题和一些评论。这里是一个可能的解决方案,利用您的客户对象上的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
        }
    }
}

3

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


我知道如何使用INotifyPropertyChanged接口来更新UI,但如果FirstName为空,我怎么样才能在UI上做出相应的变化呢? - tony clifton
如果你真的不想附加自己到事件上并以命令式的方式做你想做的事情,你可以通过将一些逻辑封装在例如字符串->布尔转换器中,并使用生成的布尔值驱动某些可见性属性来声明式地完成它。然而,我不知道如何在XAML中弹出一个MessageBox。 - flq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接