我有以下类结构和IM试图闭上眼睛,在另一个类属性的变化在课堂上触发事件。在C类道具属性绑定到每一个用户蜱或unticks那盒子时间复选框元素如此 - 所以当它改变从时真亦假,反之亦然 - 我想传递这一信息转达给A类,使其能够运行MethodTriggeredByChangeinProp。我需要类A知道B类的哪个实例以及在B,其类C的实例被触发该方法。我能想到的唯一的事情就是让listC一个ObservableCollection和B类添加PropertyChanged事件,但后来我弄不清楚哪里从那里,它喜欢为A级。任何帮助表示赞赏!谢谢。
public class A{
List<B> listB;
void MethodTriggeredByChangeinProp(){
}
}
public class B{
List<C> listC;
}
public class C{
public bool Prop{ get; set; }
}
这可以用“业主”的只是INotifyPropertyChanged
和跟踪来完成。
C类将跟踪的属性发生变化,但将接受B owner
和建设的A notifyMe
对象:
public class C : INotifyPropertyChanged
{
public C(B owner, A notifyMe)
{
Owner = owner;
PropertyChanged += notifyMe.MethodTriggeredByChangeinProp;
}
public B Owner { get; private set; }
private bool prop;
public bool Prop
{
get => prop;
set
{
prop = value;
NotifyPropertyChanged();
}
}
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
public event PropertyChangedEventHandler PropertyChanged;
}
B类实际上并不需要什么特别的,除非你想知道当C类的对象添加到您的列表 - 那么你需要的ObservableCollection
设置;否则,List<C>
是罚款。
A类的MethodTriggeredByChangeinProp
稍有变化:
public class A
{
public List<B> listB;
public void MethodTriggeredByChangeinProp(object sender, PropertyChangedEventArgs e)
{
if(sender is C responsibleC)
{
var responsibleB = responsibleC.Owner;
var changedProp = e.PropertyName;
}
}
你现在知道B类和C类的实例负责在一个每当C的属性更改
您可能还需要看一看在Observer Pattern in .NET进行了较为深入的配置。