将属性更改事件添加到自定义控件

时间:2012-07-09 07:55:29

标签: c# winforms events custom-controls inotifypropertychanged

对于某个应用程序,我必须使用一个自定义按钮,该按钮会在更改其某个属性值时作出反应。我将名为Data的字段添加到新按钮:

public class ButtonData
{
    public string Name;
    public string Color;
    //And more stuff...
}

然后我有了新按钮的下面的代码,我希望它能够在应用程序的某个地方更新Data属性时自行更新(更改背景颜色和其他一些东西)。我发现了一些关于实现INotifyPropertyChanged接口的想法,我在我的自定义按钮中进行了设置:

public partial class ButtonPin : Button, INotifyPropertyChanged
{
    private ButtonData _data;

    public ButtonData Data
    {
        get { return _data; }
        set
        {
            if (value == _data) return;
            _data = value;
            OnPropertyChanged("Data");
        }
    }
    private bool _buttonDataAdded;


    public ButtonPin()
    {
        InitializeComponent();
    }

    public ButtonPin(ButtonData data)
    {
        Data = data;
        _buttonDataAdded = true;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
  }

现在我不确定如何使用它!例如,如果Data个对象中的颜色发生变化 某种程度上它被分配到当前按钮的数据字段,我希望这个按钮改变它的背景颜色。像

这样的东西
var data = new ButtonData();
data.Name = "Hi!";
data.Color = Color.Red;

buttonPin1.Data = data; //Here I need the changes to occur

1 个答案:

答案 0 :(得分:1)

您已经在ButtonPin类上实现了接口INotifyPropertyChanged,而不是在ButtonData类上,并且您想要检测ButtonData类型对象的更改,因此您需要在ButtonData类上实现接口INotifyPropertyChanged。

要检测更改,需要在ButtonPin.Data属性的setter中连接ButtonData对象的PropertyChanged事件。这样的事情。

private bool _data;
public ButtonData Data {
    get { return _data; }
    set {
        if (value != _data) {
            // Unhook previous events
            if (_data != null)
                _data.PropertyChanged -= HandleButtonDataPropertyChanged;
            // Set private field
            _data = value;
            // Hook new events
            if (_data != null)
                _data.PropertyChanged += HandleButtonDataPropertyChanged;
            // Immediate update  since we have a new ButtonData object
            if (_data != null)
                Update();
        }
    }
}

private void HandleButtonDataPropertyChanged(object sender, PropertyChangedEventArgs e) {
    // Handle change in ButtonData
    Update();
}

private void Update() {
    // Update...
}