2012-07-09 104 views
0

對於應用程序,我必須使用自定義按鈕,該按鈕在其屬性值之一發生更改時發生反應。我addded一個名爲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

東西,你已經實現INotifyPropertyChanged的上ButtonPin類,而不是在ButtonData類的接口,要檢測類型ButtonData的對象上的變化,從而需要執行INotifyPropertyChanged的接口ButtonData類。

要檢測更改,需要連接到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... 
} 
+0

嗯我想更新發生在'數據'對象已被分配到'按鈕',這將是相同的?! – 2012-07-09 08:16:34

+0

是的,更新()方法在專用字段設置後調用,以顯式更新您的按鈕,因爲有一個新的ButtonData對象。屬性更改事件是在設置ButtonData對象後處理更改。 – Maarten 2012-07-09 08:36:59