C# PropertyGrid:从CollectionEditor获取PropertyValueChanged通知

C# PropertyGrid:从CollectionEditor获取PropertyValueChanged通知,c#,winforms,.net-2.0,C#,Winforms,.net 2.0,PropertyGrid控件对于在运行时编辑对象非常有用。我使用它的方式如下: Form form = new Form(); form.Parent = this; form.Text = "Editing MyMemberVariable"; PropertyGrid p = new PropertyGrid(); p.Parent = form; p.Dock = DockStyle.Fill; p.SelectedObject = _MyMemberVariable; p.Proper

PropertyGrid
控件对于在运行时编辑对象非常有用。我使用它的方式如下:

Form form = new Form();
form.Parent = this;
form.Text = "Editing MyMemberVariable";

PropertyGrid p = new PropertyGrid();
p.Parent = form;
p.Dock = DockStyle.Fill;
p.SelectedObject = _MyMemberVariable;
p.PropertyValueChanged += delegate(object s, PropertyValueChangedEventArgs args) 
{ 
    _MyMemberVariable.Invalidate(); 
};

form.Show();
如您所见,我正在使用
PropertyValueChanged
通知来确定何时更新
\u MyMemberVariable
。但是,
\u MyMemberVariable
是我没有编写的类,它的一个成员是
集合
类型。
PropertyGrid
调用集合编辑器来编辑此类型。但是,当集合编辑器关闭时,我不会收到
PropertyValueChanged
通知

显然,我可以通过使用
ShowDialog()
并在对话框关闭后使
\u MyMemberVariable
无效来解决这个问题


但我希望在编辑集合时实际触发
PropertyValueChanged
事件。有没有一种方法可以在不修改
\u MyMemberVariable
的情况下实现这一点(我无法访问其源代码)

我做了一些研究,甚至复制了这个问题,但是我发现的解决方案对你没有帮助,但我希望这些信息可以帮助其他人帮助你

开始

通过创建新的windows窗体项目,向窗体添加属性网格和列表框,并将列表框设置为属性网格的选定对象,可以很容易地重现该问题

//designer code excluded
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        propertyGrid1.SelectedObject = listBox1;

        propertyGrid1.PropertyValueChanged += delegate(object s, PropertyValueChangedEventArgs args)
        {
            MessageBox.Show("Invalidate Me!");
        };

    }
}
编辑listbox的items集合时,事件将永远不会触发,原因是items属性返回对集合的引用。因为向集合中添加项实际上不会更改引用,而属性似乎从未更改,所以属性网格也不会更改

我尝试的解决方案是扩展属性网格,更新比较两者的逻辑,检查集合中的数据是否已更改,并调用事件。我尝试了这个,但是PropertyGrid有一个内部类PropertyGridView,这给我带来了问题

我希望这能帮助其他人解决你的问题


-jeremy

这不是很优雅,但它解决了当有人从属性网格更新/更改集合顺序时我遇到的问题:

propertyGrid1.PropertyValueChanged += (o, args) => PropertyGridValueChanged();
propertyGrid1.LostFocus += (sender, args) => PropertyGridValueChanged();
当他们点击其他东西时,我会听到LostFocus事件。对于我的特定用例,这个解决方案就足够了。我想我会提一下,以防其他人发现这有用