当暴露原始模型而不是单个属性时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}"/>

我该怎么做呢?如果你觉得问题不清楚,请评论,我会尽量做得更好。

当暴露原始模型而不是单个属性时INotifyPropertyChanged

问题是,除非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");
        }
    }
}