C# PropertyGrid/PropertyDescriptor AddValueChanged EventHandler Overide

C# PropertyGrid/PropertyDescriptor AddValueChanged EventHandler Overide,c#,overriding,propertygrid,eventhandler,propertydescriptor,C#,Overriding,Propertygrid,Eventhandler,Propertydescriptor,我一直在研究PropertyGrid的动态类型描述框架 并且在添加事件处理程序逻辑时遇到了一个小小的障碍。在下面的示例中,添加新项时,已将EventHandler分配给AddValueChanged // "OnPropCChanged" is hardcoded here. Dyn.TypeDescriptor td = Dyn.TypeDescriptor.GetTypeDescriptor(propertyGrid1.SelectedObject); Dyn.PropertyDescrip

我一直在研究PropertyGrid的动态类型描述框架

并且在添加事件处理程序逻辑时遇到了一个小小的障碍。在下面的示例中,添加新项时,已将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);
}
这一切都很好,但需要多种方法,每个项目一种。我想做的是实现一个全局/覆盖,其中编辑项的标签/名称可用;因为我似乎无法通过上面的object/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.AddValueChangedobject组件,EventHandler处理程序

您可以创建一个方法,该方法接受字符串propertyName,而object sender与您的顶级方法完全相同。我一直在尝试使用已更改的object sender,string change method,但是无法将其连接到PropertyDescriptor.AddValueChangedYou无法,因为其委托签名需要对象发送方EventArgs e。您需要创建一个内部方法,该方法由具有正确签名的委托调用。您的事件处理程序是否保存已更改的属性?不是从我所看到/收集的内容。它传递对象发送者,并传递事件参数e。我看不出他们有什么财产。