我有一个 Winform 应用程序,它使用颜色来突出显示某些内容。我想允许用户更改“他们的”颜色。作为一个练习,我想我会创建一个具有颜色属性的类的实例,并将其分配给一个属性网格(以获得一个不错的编辑器)。
这似乎工作正常,但我想我想让用户重置颜色(在他们摆弄并将它们设置为 20 种米色之后)。因此,我在表单中添加了一个“重置”按钮,它将对象的颜色属性设置回默认值。
但是,似乎虽然它设置了我的对象的属性,但属性网格并没有改变。如果在重置后,我做了一个属性网格“刷新”,它具有重置颜色。
我假设属性网格不知道基础对象已更改?
在这种情况下是否缺少某些东西,或者我应该接受它并在重置对象时调用 Refresh 方法?
谢谢
(这里非常相似的问题)
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.propertyGrid1.SelectedObject = new Colours();
}
private void button1_Click(object sender, EventArgs e)
{
Colours colours = this.propertyGrid1.SelectedObject as Colours;
colours.Reset();
}
}
public partial class Colours : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public Color ColourP1 { get; set; }
public void Reset()
{
this.ColourP1 = Color.Red;
var handler = this.PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs("ColourP1"));
}
}
继我对“没有订阅 INotifyPropertyChanged.PropertyChanged”的评论之后,继承 PropertyGrid 控件的缺点是什么?
public partial class MyPropertyGrid : System.Windows.Forms.PropertyGrid
{
private INotifyPropertyChanged _selectedObject;
protected override void OnSelectedObjectsChanged(EventArgs e)
{
base.OnSelectedObjectsChanged(e);
if (_selectedObject != null) _selectedObject.PropertyChanged -= selectedObject_PropertyChanged;
_selectedObject = this.SelectedObject as INotifyPropertyChanged;
if (_selectedObject != null) _selectedObject.PropertyChanged += selectedObject_PropertyChanged;
}
private void selectedObject_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
this.Refresh();
}
}