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