对于某个应用程序,我必须使用一个自定义按钮,该按钮会在更改其某个属性值时作出反应。我将名为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
答案 0 :(得分:1)
您已经在ButtonPin类上实现了接口INotifyPropertyChanged,而不是在ButtonData类上,并且您想要检测ButtonData类型对象的更改,因此您需要在ButtonData类上实现接口INotifyPropertyChanged。
要检测更改,需要在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...
}