Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
INotifyPropertyChanged WPF_Wpf_Inotifypropertychanged - Fatal编程技术网

INotifyPropertyChanged WPF

INotifyPropertyChanged WPF,wpf,inotifypropertychanged,Wpf,Inotifypropertychanged,InotifyProperty更改的目的是什么。我知道每次更改属性时都会触发此事件,但视图/UI如何知道触发了此事件: 以下是实现INotifyPropertyChanged事件的我的Customer类: public class Customer : INotifyPropertyChanged { private string _firstName; public string LastName { get; set; } publ

InotifyProperty更改的目的是什么。我知道每次更改属性时都会触发此事件,但视图/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或empty时,我如何在UI上显示MessageBox。

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

编辑:我重新阅读了你的问题和一些评论。下面是一个可能的解决方案,它利用客户对象上的事件和INotifyPropertyChanged接口。您还应该研究WPF和.NET3.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
        }
    }
}

//假设:
//myWindow.DataContext=新客户();
myWindow.DataContextChanged+=myWindow\u DataContextChanged;
私有void MyWindow_DataContextChanged(对象发送方,
DependencyPropertyChangedEventArgs(附件e)
{
var oldCustomer=e.OldValue作为客户;
if(oldCustomer!=null)
{
oldCustomer.PropertyChanged-=客户检查道具;
}
var newCustomer=e.NewValue作为客户;
if(newCustomer!=null)
{
newCustomer.PropertyChanged+=客户检查道具;
}
}
私有void Customer_CheckProps(对象发送方,PropertyChangedEventArgs e)
{
var customer=发送方为客户;
如果(客户!=null)
{
如果(e.PropertyName==“FirstName”
&&String.IsNullOrEmpty(customer.FirstName))
{
//显示消息框
}
}
}

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


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

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