У меня есть приложение Winform, которое использует цвет, чтобы выделить некоторые вещи. Я бы хотел, чтобы пользователи меняли "свои" цвета. В качестве упражнения я решил создать экземпляр класса со свойствами для цветов и назначить его сетке свойств (чтобы получить хороший редактор).
Кажется, что все нормально, но я подумал, что хотел бы позволить пользователям reset цвета (после того, как они поиграли и установили их на 20 оттенков бежевого). Итак, я добавил кнопку "reset" в мою форму, которая вернула свойства цвета моего объекта по умолчанию.
Однако кажется, что, пока он возвращает мои свойства объекта, сетка свойств не изменяется. Если после reset я создаю сетку свойств "Обновить", она имеет цвет reset.
Я предполагаю, что сетка свойств не знает, что базовый объект был изменен?
Есть ли что-то в этом сценарии или я должен просто принять его и вызвать метод Refresh, когда я reset мой объект?
Спасибо
(очень похожий вопрос здесь)
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();
}
}