代码之家  ›  专栏  ›  技术社区  ›  Jason Sundram Red Alert

PropertyGrid:从CollectionEditor获取PropertyValueChanged通知

  •  1
  • Jason Sundram Red Alert  · 技术社区  · 17 年前

    这个 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 确定何时更新的通知 _MyMemberVariable 是的。然而, _ MyMemberVariable变量 是一个我没有写的类,它的一个成员是 Collection 键入。这个 属性表格 调用集合编辑器来编辑此类型。但是,当集合编辑器关闭时,我不会得到 属性值已更改 通知

    显然,我可以通过使用 ShowDialog() 以及宣告无效 _ MyMemberVariable变量 对话框关闭后。

    但我真的想 属性值已更改 编辑集合时激发的事件。有没有办法不用修改 _ MyMemberVariable变量 (我无法访问其源代码)?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Jason Sundram Red Alert    13 年前

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

    propertyGrid1.PropertyValueChanged += (o, args) => PropertyGridValueChanged();
    propertyGrid1.LostFocus += (sender, args) => PropertyGridValueChanged();
    

    我听着 LostFocus 当他们点击其他东西时的事件。对于我的特定用例,这个解决方案就足够了。我想我应该提一下,以防别人发现这个有用。

        2
  •  0
  •   Jeremy    17 年前

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

    来了

    通过创建新的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!");
            };
    
        }
    }
    

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

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

    我希望这能帮助别人解决你的问题。

    -杰瑞米