色を使用して特定のものを強調表示する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();
}
}