【问题标题】:PropertyGrid does not raise PropertyValueChanged eventPropertyGrid 不会引发 PropertyValueChanged 事件
【发布时间】:2013-02-27 11:10:40
【问题描述】:

当用户在 PropertyGrid 中更改文本或布尔值时,我在事件处理程序中设置 flagModified=true;

private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
    {
        propertyGrid1.Refresh();
        PropertyChanged(true);
    } 

然后保存按钮被启用。

我使用我的编辑器和表单(参见下面的课程)来编辑 Properrtygrid 中的值之一。它是我班的对象。 在编辑器中更改对象并关闭编辑器后,我将对象的值重新分配给新值(值 = frm.m_DS;)。一切正常,但有一刻:在这种情况下,PropertyValueChanged 没有被提升。 我使用 PropertyValueChanged 事件来启用我的按钮“保存”,它将所有属性保存到文件中。 如何捕获值更改的事件并启用“保存”按钮?。

public class DataProviderEditor : UITypeEditor
    {

        public override Object EditValue(
          ITypeDescriptorContext context,
          IServiceProvider provider,
          Object value)
        {
            if ((context != null) && (provider != null))
            {
                IWindowsFormsEditorService svc =
                  (IWindowsFormsEditorService)
                  provider.GetService(typeof(IWindowsFormsEditorService));

                if (svc != null)
                {
                    using (DatasourceForm frm =
                      new DatasourceForm((MyDatasource)value))
                    {
                        if (svc.ShowDialog(frm) == DialogResult.OK)
                        {
                            value = frm.m_DS;
                        }
                    }
                }
            }

            return base.EditValue(context, provider, value);
        }

【问题讨论】:

  • 但是当我使用我的编辑器作为对象时 - 你在这里是什么意思?能改一下吗?
  • 它只能可靠地引发它自己编辑的值的事件,而不是它交给另一个编辑器的值。它没有比较 object 类型的值的管道。没有简单的解决方法。
  • 我已经编辑了文本。

标签: c# propertygrid


【解决方案1】:

我注意到有关事件PropertyGrid.PropertyValueChanged 的文档存在缺陷。它没有提到只有在用户更改值时才会引发事件。如果您查看PropertyValueChangedEventArgs 文档,您可以找到这一点,该文档说:

PropertyValueChanged 事件在用户更改 PropertyGrid 中指定为 GridItem 的属性值时发生。

您可以将PropertyValueChanged事件添加到PropertyGrid浏览的对象中。你可以这样编码:

public class BrowsedObject
{
    public event EventHandler PropertyValueChanged;

    private void OnPropertyValueChanged(object sender, EventArgs e)
    {
        EventHandler eh = PropertyValueChanged;
        if (eh != null)
            eh(sender, e);
    }

    private string someProperty;
    public new string SomeProperty
    {
        get { return someProperty; }
        set
        {
            someProperty = value;
            OnPropertyValueChanged(this, EventArgs.Empty);
        }
    }
}

每次为SomeProperty 分配一个新值时,对象都会引发PropertyValueChanged。您可以连接到此事件逻辑,即启用 保存按钮 等。

或者

每次从代码中更改对象属性时,为什么不直接调用PropertyChanged(true);

【讨论】:

  • 感谢 Dzienny。我试过 INotifyPropertyChanged。这也是解决方案。
【解决方案2】:

对于一个非常简单的“自动更新”人员,您可以这样做:

propertyGrid1.SelectedObject = propertyGrid1.SelectedObject;

它似乎奏效了,变化是可见的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多