2012-07-09 79 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

相关问题