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事件。对于我的特定用例,这个解决方案就足够了。我想我会提一下,以防其他人发现这有用