簡體   English   中英

將屬性更改事件添加到自定義控件

[英]Adding property changed event to a custom control

對於一個應用程序,我必須使用一個自定義按鈕,該按鈕在其屬性值之一更改時會做出反應。 我在新按鈕中添加了一個名為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

您已經在ButtonPin類而不是ButtonData類上實現了INotifyPropertyChanged接口,並且您想檢測到ButtonData類型的對象上的更改,因此需要在ButtonData類上實現INotifyPropertyChanged接口。

要檢測更改,您需要連接到ButtonPin.Data屬性的設置器中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...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM