首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >INotifyPropertyChanged WPF

INotifyPropertyChanged WPF
EN

Stack Overflow用户
提问于 2009-06-24 16:37:59
回答 3查看 15.8K关注 0票数 3

INotifyPropertyChanged的用途是什么?我知道每当属性发生变化时都会触发此事件,但View/UI如何知道此事件已触发:

下面是实现INotifyPropertyChanged事件的Customer类:

代码语言:javascript
复制
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。

EN

回答 3

Stack Overflow用户

发布于 2009-06-24 16:42:48

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

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

票数 5
EN

Stack Overflow用户

发布于 2009-06-24 16:41:56

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

票数 3
EN

Stack Overflow用户

发布于 2009-06-24 16:42:08

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

代码语言:javascript
复制
<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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1039505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档