gpt4 book ai didi

c# - 如何让父类知道其子类的变化?

转载 作者:太空狗 更新时间:2023-10-29 18:19:08 25 4
gpt4 key购买 nike

这是一个示例代码:

public class MyParent : INotifyPropertyChanged
{
List<MyChild> MyChildren;

public bool IsChanged
{
get
{
foreach (var child in MyChildren)
{
if (child.IsChanged) return true;
}
return false;
}
}


public event PropertyChangedEventHandler PropertyChanged;
private void RaiseChanged(string propName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propName));
}
}

public class MyChild : INotifyPropertyChanged
{
private int _Value;
public int Value
{
get
{
return _Value;
}
set
{
if (_Value == value)
return;
_Value = value;
RaiseChanged("Value");
RaiseChanged("IsChanged");
}
}
private int _DefaultValue;
public int DefaultValue
{
get
{
return _DefaultValue;
}
set
{
if (_DefaultValue == value)
return;
_DefaultValue = value;
RaiseChanged("DefaultValue");
RaiseChanged("IsChanged");
}
}

public bool IsChanged
{
get
{
return (Value != DefaultValue);
}
}

public event PropertyChangedEventHandler PropertyChanged;
private void RaiseChanged(string propName)
{
if (PropertyChanged != null)
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propName));
}
}

假设我现在有两个类实例,一个作为 myParent,另一个作为 myChild。我有两个视觉元素,每个元素都有一个属性绑定(bind)到我的实例的 IsChnaged 属性; ElementA 绑定(bind)到 myParent.IsChanged,ElementB 绑定(bind)到 myChild.IsChanged。

当 myChild.Value 与其默认值不同时,myChild.IsChanged 设置为 true 并相应地更新 ElementB。

我需要的是当任何一个 myParent 子级(这里只有一个)的 IsChanged 值设置为 true 时,它​​自己的(父级的)IsChanged 值设置为 true 及其对应的元素(此处为 ElementA)进行相应更新。

myParent.IsChanged 仅被读取一次(当设置绑定(bind)时)并且它对其子项的更改没有任何感觉。我应该把 MyParent 的 RaiseChanged("IsChanged") 放在哪里?我怎样才能让父级知道它的子级何时发生了变化?

提前致谢

最佳答案

INotifyPropertyChanged 已经为您提供了机制:PropertyChanged 事件。只需让父级为其子级的 PropertyChanged 添加一个处理程序,然后在该处理程序中调用 RaiseChanged("IsChanged");

此外,您可能希望将 INotifyPropertyChanged 实现放在基类中,并让您的(看起来是)ViewModels 继承自该基类。当然,此选项不是必需的,但它会使代码更简洁。

更新:在父对象中:

// This list tracks the handlers, so you can
// remove them if you're no longer interested in receiving notifications.
// It can be ommitted if you prefer.
List<EventHandler<PropertyChangedEventArgs>> changedHandlers =
new List<EventHandler<PropertyChangedEventArgs>>();

// Call this method to add children to the parent
public void AddChild(MyChild newChild)
{
// Omitted: error checking, and ensuring newChild isn't already in the list
this.MyChildren.Add(newChild);
EventHandler<PropertyChangedEventArgs> eh =
new EventHandler<PropertyChangedEventArgs>(ChildChanged);
newChild.PropertyChanged += eh;
this.changedHandlers.Add(eh);
}

public void ChildChanged(object sender, PropertyChangedEventArgs e)
{
MyChild child = sender as MyChild;
if (this.MyChildren.Contains(child))
{
RaiseChanged("IsChanged");
}
}

您实际上不必向子类添加任何内容,因为它在更改时已经引发了正确的事件。

关于c# - 如何让父类知道其子类的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6649983/

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