c# - 当另一个对象的属性发生更改时通知一个对象

标签 c# .net inotifypropertychanged

我有一个名为 Page 的父对象,它有一个名为 Control 的对象列表:

public class Page
{
   List<CustomControl> controls {get;set;}
}

CustomControl 类具有以下定义:

public class CustomControl
{
 string Name {get;set;}
 string Value {get;set;}
}

假设Page类有两个CustomControls A和B。当自定义控件A的属性值发生变化时是否可以通知自定义控件B,以便它可以更改其某些属性。

我正在考虑在 CustomControl 类上实现 INotifyPropertyChanged 事件,现在当同一类的另一个实例具有其 Modified 的某些属性时,如何通知 CustomControl 的实例。

最佳答案

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<CustomControl>
{
    // 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<CustomControl> 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);
    }
}

关于c# - 当另一个对象的属性发生更改时通知一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3562738/

相关文章:

wpf - 简单的小 INotifyPropertyChanged 实现

c# - 从 datagridview 列表达式调用自定义方法

.net - .NET 4.6.2 中的 WCF 是否支持 CNG KSP 中带有 PK 的服务器证书?

c# - 如何获取canvas wpf中的所有对象坐标

c# - Sharepoint 2010。搜索

.net - 代码执行期间缓存(或其他变量)是否可以更改?

c# - 如何从 PropertyChanged 调用异步方法?

c# - MVVM:使用Fody.PropertyChanged更改了属性的触发方法

c# - WinForms:将自定义 ToolStripMenuItem 添加到设计器中的 MenuStrip

c# - MySql 数据库的连接字符串