0

アプリケーションの場合、プロパティ値の 1 つが変更されたときに反応するカスタム ボタンを使用する必要があります。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
4

1 に答える 1

1

ButtonDataクラスではなくButtonPinクラスにインターフェイス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...
}
于 2012-07-09T08:11:47.833 に答える