【发布时间】:2011-07-11 12:20:40
【问题描述】:
这是一个示例代码:
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。 我有两个视觉元素,每个元素都有一个绑定到我的实例的 IsChnaged 属性的属性; ElementA 绑定到 myParent.IsChanged,ElementB 绑定到 myChild.IsChanged。
当 myChild.Value 与其默认值不同时,myChild.IsChanged 设置为 true 并且 ElementB 会相应更新。
我需要的是当任何一个 myParent 孩子(这里只有一个)将其 IsChanged 值设置为 true,将其自己(父母的)IsChanged 值设置为 true 并且其对应的 元素(此处为 ElementA)进行相应更新。
myParent.IsChanged 只被读取一次(当绑定被设置时)并且它对它的孩子改变没有任何意义。我应该把 MyParent 的 RaiseChanged("IsChanged") 放在哪里?我如何让父母知道它的孩子何时发生了变化?
提前致谢
【问题讨论】:
-
你可以让你的子构造函数将父对象作为参数,在创建这些子对象时你可以在构造函数中给父对象。
-
这是我想避免的事情,我宁愿不在构造函数中甚至作为属性将父级介绍给子级。有没有其他办法?
标签: c# wpf binding parent-child inotifypropertychanged