Dumbo
Dumbo

Reputation: 14142

Adding property changed event to a custom control

For an application I have to use a custom button that react when one of its properties value is being changed. I addded a field named Data to the new button:

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

Then I have the folowing code for new button, I want it to be able to update itself (change background color and some other stuff) whenever its Data property gets updated from somewhere in application. I found some ideas about implementing INotifyPropertyChanged interface and I set it up in my custom button like this:

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));
    }
  }

Now I am not sure how to use this! For example, if the Color in Data objects gets changed somehow somewhere and its get assigned to current button's Data field, I want this button to change its background color. Something like

var data = new ButtonData();
data.Name = "Hi!";
data.Color = Color.Red;

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

Upvotes: 0

Views: 6769

Answers (1)

Maarten
Maarten

Reputation: 22955

You have implemented the interface INotifyPropertyChanged on the ButtonPin class, not on the ButtonData class, and you want to detect a change on an object of type ButtonData, thus you need to implement the interface INotifyPropertyChanged on the ButtonData class.

To detect the change you need to hook up to the PropertyChanged event of the ButtonData object in the setter of the ButtonPin.Data property. Something like this.

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...
}

Upvotes: 1

Related Questions