当暴露原始模型而不是单个属性时INotifyPropertyChanged
本文关键字:单个 属性 INotifyPropertyChanged 暴露 原始 模型 | 更新日期: 2023-09-27 18:16:13
这是我目前实现INotifyPropertyChanged
的方式-
public class ViewModel : INotifyPropertyChanged
{
public Person Person1 { get; set; }
public Person Person2 { get; set; }
public string Person1Name
{
get { return Person1.Name; }
set
{
Person1.Name = value;
RaisePropertyChangedEvent("Person1Name");
}
}
public string Person2Name
{
get { return Person2.Name; }
set
{
Person2.Name=value;
RaisePropertyChangedEvent("Person2Name");
}
}
}
//This is the Model
public class Person
{
private string _name;
public string Name { get; set; }
}
以及我用于这种类型实现的XAML -
<Label Text="{Binding Path=Person1Name}"/>
<Label Text="{Binding Path=Person2Name}"/>
我想做的是在模型中的任何属性更改时调用IRaisePropertyChangedEvent,但我不想显式地公开我在那里所做的属性。我只是想公开整个模型,只要模型中的属性发生变化,它就应该引发notify事件。但是我不希望模型实现INotifyPropertyChanged,我希望ViewModel实现它。所以基本上我要看的是这样的-
public class ViewModel : INotifyPropertyChanged
{
public Person Person1
{
get { return _person1; }
set
{
_person1 = value;
RaisePropertyChangedEvent("Person1");
//So, whenever a property within my Person1 changes, raise event for that property.
}
}
public Person Person2
{
get { return _person2; }
set
{
_person2 = value;
RaisePropertyChangedEvent("Person2");
}
}
}
XAML: <Label Text="{Binding Path=Person1.Name}"/>
<Label Text="{Binding Path=Person2.Name}"/>
我该怎么做呢?如果你觉得问题不清楚,请评论,我会尽量做得更好。
问题是,除非Person
实现了INotifyPropertyChanged
,否则您无法跟踪person实例中的属性何时被更改。
像这样的绑定:
<Label Text="{Binding Path=Person1.Name}"/>
不改变Person1
实例,而是改变同一实例中的一个属性。除非这个类实现了INPC,否则你永远不会"看到"属性已经改变,也永远不会引发事件。
你应该在ViewModel中包装你的Person对象:
public class PersonViewModel : INotifyPropertyChanged
{
private Person _person;
public PersonViewModel(Person person)
{
_person = person;
}
public string Name
{
get
{
return _person.Name;
}
set
{
_person.Name = value;
RaiseNotifyPropertyChanged("Name");
}
}
}
,那么你的视图模型类看起来像:
public class ViewModel : INotifyPropertyChanged
{
public PersonViewModel Person1
{
get { return _person1; }
set
{
_person1 = value;
RaisePropertyChangedEvent("Person1");
//So, whenever a property within my Person1 changes, raise event for that property.
}
}
public PersonViewModel Person2
{
get { return _person2; }
set
{
_person2 = value;
RaisePropertyChangedEvent("Person2");
}
}
}