Notify One object when a property of another object changes

后端 未结 2 1926
北海茫月
北海茫月 2021-02-09 21:31

I have a parent object called Page that has a List of objects called Control:

public class Page
{
   List controls {get;set;}
}
2条回答
  •  臣服心动
    2021-02-09 22:00

    public class CustomControl : INotifyPropertyChanged
    {
        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                if (_name == value) return;
                _name = value;
                PropertyChanged(this, new PropertyChangedEventArgs("Name"));
            }
        }
    
        private string _value;
        public string Value
        {
            get { return _value; }
            set
            {
                if (_value == value) return;
    
                _value = value;
                PropertyChanged(this, new PropertyChangedEventArgs("Value"));
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged = delegate { };
    
        internal virtual void OnSiblingInPagePropertyChanged(object sender, PropertyChangedEventArgs args)
        {
    
        }
    }
    
    public class CustomControlObservableColletion : ObservableCollection
    {
        // Required because, by default, it is not possible to find out which items
        // have been cleared when the CollectionChanged event is fired after a .Clear() call.
        protected override void ClearItems()
        {
            foreach (var item in Items.ToList())
                Remove(item);
        }
    
    }
    
    public class Page
    {
        public IList Controls { get; private set; }
    
        public Page()
        {
            var controls = new CustomControlObservableColletion();
            controls.CollectionChanged += OnCollectionChanged;
            Controls = controls;
        }
    
        private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            switch (e.Action)
            {
                case NotifyCollectionChangedAction.Add:
                    RegisterControls(e.NewItems);
                    break;
    
                case NotifyCollectionChangedAction.Replace:
                    RegisterControls(e.NewItems);
                    DeRegisterControls(e.OldItems);
                    break;
    
                case NotifyCollectionChangedAction.Remove:
                    DeRegisterControls(e.OldItems);
                    break;
            }
        }
    
        private void RegisterControls(IList controls)
        {
            foreach (CustomControl control in controls)
                control.PropertyChanged += OnControlPropertyChanged;
        }
    
        private void DeRegisterControls(IList controls)
        {
            foreach (CustomControl control in controls)
                control.PropertyChanged -= OnControlPropertyChanged;
        }
    
        private void OnControlPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            foreach (var control in Controls.Where(c => c != sender))
                control.OnSiblingInPagePropertyChanged(sender, e);
        }
    }
    

提交回复
热议问题