Как вызвать событие от изменения свойства в одном классе в другом классе? - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть следующая структура класса, и я пытаюсь вызвать событие в классе, когда происходит изменение свойства в другом классе.свойство prop в классе C связано с элементом checkbox, поэтому каждый раз, когда пользователь ставит или снимает отметку с этого поля, то есть когда оно изменяется с true на false или наоборот, я хочу доставить это сообщение классу A, чтобы он мог запускать MethodTriggeredByChangeinProp.Мне нужен класс A, чтобы знать, какой экземпляр класса B, а также какой экземпляр класса C в B вызывает этот метод.Единственное, о чем я могу думать, это сделать listC наблюдаемой коллекцией и добавить событие propertychanced в классе B, но потом я не понимаю, куда идти дальше и нравится ли ему класс 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 голосов
/ 10 февраля 2019

Это может быть достигнуто с помощью 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 в A всякий раз, когда свойство изменяетсяC.

Вы также можете взглянуть на шаблон наблюдателя в .NET для более подробной настройки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...