У меня есть приложение 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();
}
}