【发布时间】:2021-05-15 02:39:36
【问题描述】:
我有一个类“BaseClass”,它实现了INotifyPropertyChanged 并具有以下内容:
基类:
private bool isOn;
public bool IsOn
{
get { return isOn; }
set
{
isOn = value;
RaisePropertyChanged("BaseClass:IsOn");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
然后我有一个类“DIClass”,它也实现了INotifyPropertyChanged。它还有一个ObservableCollection<BaseClass>:
DI类:
public ObservableCollection<BaseClass> ClassesOfA;
private string iNPCTest;
public string INPCTest
{
get { return iNPCTest; }
set
{
iNPCTest = value;
RaisePropertyChanged("DIClass: INPCTest");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
我的 ViewModel 拥有一个“DIClass”实例并注册到它的PropertyChanged 事件。当我在“DIClass”中设置INPCTest 的值时,ViewModel 会正确“捕获”事件。但是,当我更新ObservableCollection 中的IsOn 属性时,如下所示,ViewModel 中没有拾取该事件。
ClassesOfA[0].IsOn = true;
为什么 INPC 接口不能与嵌套属性一起使用? here的问答似乎很相关,但我想不通。
编辑:附加说明和代码:
我可以注册ObservableCollection的项目的PropetyChanged事件,例如:
ClassesOfA[0].PropertyChanged += DIClass_PropertyChanged;
ClassesOfA[1].PropertyChanged += DIClass_PropertyChanged;
但是,这仍然不能通知我的ViewModel,我的DIClass 的ObservableCollection<BaseClass> 的属性已更改。我想使用 INPC 通过 MVVM 层向上冒泡事件信息/属性更新。但是我想“包装”它们以使我的类更干净/更少的属性
编辑:
我添加了我的问题/场景的这个“草图”,并带有基本命名以使其简单:
【问题讨论】:
-
BaseClass 的 PropertyChanged 事件不会传播到 DIClass。您必须在
ClassesOfA中注册每个项目才能收到有关其更改的通知。可观察的集合并不意味着可以观察到其项目的变化,但可以观察到集合的(添加、删除、...) -
嗨@Fildor,我应该在我的ViewModel 中注册
ClassesOfA的每一项吗?类似DIClass.ClassesOfA[0].PropertyChanged =+ ...? -
如果你需要的话。但我其实对此表示怀疑。为什么你的 ViewModel 需要观察这个?
-
我为
DIClass中的每个项目注册了这样的:ClassesOfA[0].PropertyChanged += DIClass_PropertyChanged;,当IsOn更新时调用此属性更改方法。但我需要我的 ViewModel 知道IsOn何时更改,以便更新我的 UI。
标签: c# mvvm uwp inotifypropertychanged