そして、イベント ハンドラー ロジックを追加することで、わずかな障害にぶつかりました。例に従って、新しいアイテムを追加するときに、EventHandler を「AddValueChanged」に割り当てました。
// "OnPropCChanged" is hardcoded here.
Dyn.TypeDescriptor td = Dyn.TypeDescriptor.GetTypeDescriptor(propertyGrid1.SelectedObject);
Dyn.PropertyDescriptor pd = new Dyn.PropertyDescriptor(propertyGrid1.SelectedObject.GetType( ), "PropC", typeof(string), "Hello world",
pd.AddValueChanged(propertyGrid1.SelectedObject, new EventHandler(this.OnPropCChanged));
td.GetProperties( ).Add(pd);
そして、イベント ハンドラー:
private void OnPropCChanged( object sender, EventArgs e )
{
// "PropC" is hardcoded here.
Dyn.PropertyDescriptor pd = Dyn.TypeDescriptor.GetTypeDescriptor(sender).GetProperties( ).Find("PropC", true) as Dyn.PropertyDescriptor;
string sNewValue = pd.GetValue(sender).ToString();
MessageBox.Show("New value is: " + sNewValue);
}
これはすべて正常に機能しますが、アイテムごとに 1 つずつ、複数のメソッドが必要です。私がやりたいのは、編集されたアイテムのラベル/名前が利用できるグローバル/オーバーライドを実装することです。上記のオブジェクト/ EventArgs を介してこれを取得できないようです。
現在、以下のように、変更されたメソッドを呼び出すだけの複数のメソッドがあります。
private void FooChanged( object sender, EventArgs e )
{
changed(sender, "Foo");
}
private void BarChanged( object sender, EventArgs e )
{
changed(sender, "Bar");
}
private void changed( object sender, string change )
{
switch(change)
{
case "Foo": break; // Do Foo actions
case "Bar": break; // Do Bar actions
}
}
以下のようなものを実装しようとしていますが、すべてを結び付ける/ AddValueChanged イベントに割り当てる方法がわかりません。
private void FooBarChanged( object sender, PropertyChangedEventArgs e )
{
string change = e.PropertyName.ToString();
switch(change)
{
case "Foo": break; // Do Foo actions
case "Bar": break; // Do Bar actions
}
}
次のように EventHandler を渡す必要があるようです: PropertyDescriptor.AddValueChanged(object component, EventHandler handler)