gpt4 book ai didi

c# - INotifyPropertyChanged 不适用于 ObservableCollection 中的类

转载 作者:行者123 更新时间:2023-12-03 10:52:39 25 4
gpt4 key购买 nike

我有一个实现 INotifyPropertyChanged 的类“BaseClass”并具有以下内容:
基类:

    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事件。当我设置 INPCTest 的值时在“DIClass”中,ViewModel 正确地“捕获”了事件。但是,当我更新 IsOn ObservableCollection 内的属性(property),如下所示,ViewModel 中没有拾取事件。
ClassesOfA[0].IsOn = true;
为什么 INPC 接口(interface)不适用于嵌套属性?问答 here似乎很相关,但我无法弄清楚。
编辑:附加解释和代码:
我可以注册到 PropetyChanged ObservableCollection 的事件的项目,例如:
        ClassesOfA[0].PropertyChanged += DIClass_PropertyChanged;
ClassesOfA[1].PropertyChanged += DIClass_PropertyChanged;
但是,这仍然没有冒泡通知我的 ViewModel ,这是我的 DIClass 的属性(property)的 ObservableCollection<BaseClass>已经改变。我想使用 INPC 通过 MVVM 层向上冒泡事件信息/属性更新。但我想“包装”它们以使我的类(class)更干净/更少的属性
编辑:
我添加了我的问题/场景的这个“草图”,并带有基本命名以使其变得容易:
enter image description here

最佳答案

回答您的问题:这是设计使然。
ObservableCollection 有两个事件:

  • CollectionChanged:当集合改变时触发,例如collection.Add( item )
  • PropertyChanged:当属性改变时触发,例如collection = new ObservablecCollection<T>();

  • 我认为您不需要 ObservableCollection,因为-据我了解您的问题-您想观察集合中项目属性的变化。要实现这一点,您需要像这样注册每个观察到的项目的 PropertyChanged:
    public List<BaseClass> Collection {get;set;}

    public void InitializeCollection( IEnumerable<BaseClass> baseClassCollection){
    Collection = new List<BaseClass>();
    foreach(var item in baseClassCollection){
    item.PropertyChanged += MethodToCallOnPropertyChanges;
    Collection.Add( item );
    }
    }

    public void MethodToCallOnPropertyChanges(object sender, PropertyChangedEventArgs e){
    //react to any property changes
    doSomething();
    //react to specific properties
    if(e != null && e.PropertyName.Equals("isOn"))
    doSomethingOtherStuff();
    }
    这可能非常烦人,并可能导致其他一些问题。
    如果我遇到这种情况,我会考虑重新设计 ViewModel 和 UI。我会尝试有一个绑定(bind)到每个 BaseClass 项目的 UI。例如,如果我有一个 ListView,我将提供一个 ItemTemplate,BaseClass 项在其中绑定(bind)。这样做可以避免注册到每个项目的 PropertyChanged。

    关于c# - INotifyPropertyChanged 不适用于 ObservableCollection<Class> 中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66153327/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com