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

时间:2019-02-09 23:45:37

标签: c# observablecollection inotifypropertychanged

我具有以下类结构,并且当另一个类的属性发生更改时,我试图触发类中的事件。 C类的prop属性绑定到一个checkbox元素,因此每次用户勾选或取消选中该框时-因此,当它从true变为false或反之亦然时-我想将该消息传递给A类,以便它可以运行 MethodTriggeredByChangeinProp。我需要A类来知道B类的哪个实例,以及B中C类的哪个实例正在触发该方法。我唯一能想到的就是使listC成为可观察的集合,并在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; }
}

1 个答案:

答案 0 :(得分:0)

只需INotifyPropertyChanged并跟踪“所有者”即可实现。

C类将跟踪属性更改,但在构造时将接受B ownerA 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;
            }
        }

现在,只要C中的属性发生更改,您就知道A中B类和C类的负责实例。

您可能还想看看Observer Pattern in .NET以获得更深入的配置。