【问题标题】:Editing and firing PropertyValueChanged event for a List<string> in a PropertyGrid为 PropertyGrid 中的 List<string> 编辑和触发 PropertyValueChanged 事件
【发布时间】:2014-08-27 16:09:06
【问题描述】:

我正在尝试使用 PropertyGrid 编辑 List&lt;string&gt;,但在其内容被修改时它不会触发 PropertyValueChanged 事件。

我对此进行了研究并尝试使用自定义 TypeConverter 类,但即使我让编辑器显示并让我修改值,我也无法触发此事件。

我也尝试使用以下属性,它会调出字符串编辑器,但这也不会在更改时触发事件。

[Editor("System.Windows.Forms.Design.StringCollectionEditor, System.Design, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
    "System.Drawing.Design.UITypeEditor, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]

我也尝试使用 UITypeEditor 并覆盖 EditValue 方法,但在编辑值时不会触发。

public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
  MessageBox.Show("This never appears...");
  return base.EditValue(context, provider, value);
}

有没有办法编辑List&lt;string&gt; 触发 PropertyValueChanged 事件?

【问题讨论】:

标签: c# winforms


【解决方案1】:

您应该使用BindingList&lt;string&gt; 而不是List&lt;string&gt; 来触发PropertyValueChanged 事件。

编辑:

@LarsTech 指出ObservableCollection&lt;string&gt; 在 WPF 中实际使用,但在 winforms 中没有,您应该改用BindingList&lt;string&gt;

简而言之,BindingListObservableCollection 支持更多的接口和更多的功能。以下是BindingList 的一些优势:

  • BindingList 实现了 IBindingList&lt;T&gt;,但 ObservableCollection 没有。 IBindingList 提供了一大堆功能,UI 可以使用这些功能提供更多内容,请查看 here 了解更多详情
  • BindingList 实现了ICancelAddNew,数据绑定机制用于取消新添加的项目;
  • ObservableCollection 不会监听其子节点的变化,而只会监听 InsertRemove 事件;

第 2 点和第 3 点的完整学分致:ObservableCollection(Of T) vs BindingList(Of T)?

【讨论】:

  • 在WinForms中,通常使用BindingList
  • 这最终对我有用。我订阅了BindingListListChanged 事件。这个事件比列表中的项目数多触发一次,所以我必须考虑到这一点。不完全是我要找的东西,但这让我振作起来。谢谢!编辑:另外,这不会触发PropertyValueChanged,至少我不能说。
【解决方案2】:

正如 langstrom 所述,BindingList 不会触发 PropertyValueChanged 事件。

我使用了一个简单而丑陋的解决方法:我在调整后设置了完整的集合(它只有几个项目):

CollectionValue=CollectionValue

(如果 IDataErrorInfo 为编辑的属性提供了一些错误,我的目标是在我的自定义 PropertyGrid 编辑器周围为 ObservableCollection(Of String) 设置一个红色边框。)

另见

https://wpftoolkit.codeplex.com/discussions/544080(讨论)

https://wpftoolkit.codeplex.com/workitem/20977(出票)

【讨论】:

    【解决方案3】:

    如果在使用 PropertyGrid 修改值后 BindingList 未刷新,则可以调用 yourBindingList.ResetBindings() 来触发更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 2011-07-15
      • 1970-01-01
      • 2011-10-07
      相关资源
      最近更新 更多