PropertyGrid не замечает изменения свойств в коде?

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

11
задан Community 23 May 2017 в 12:26
поделиться