如何触发从另一个类在一个类中的属性改变的事件?

问题描述 投票:0回答:1

我有以下类结构和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; }
}
c# observablecollection inotifypropertychanged
1个回答
0
投票

这可以用“业主”的只是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进行了较为深入的配置。

© www.soinside.com 2019 - 2024. All rights reserved.