【问题标题】:ExpandoObject PropertyChanged event not triggering in propertygrid未在 propertygrid 中触发 ExpandoObject PropertyChanged 事件
【发布时间】:2022-06-10 21:46:12
【问题描述】:

基本上我正在加载一个 JSON 对象,其中包含在运行时可用或不可用的值组合,因此我需要知道何时修改特定属性以切换所有其他可浏览等。虽然 PropertyChange 事件是处理它的完美方式。

所以我可以添加一个事件处理程序来触发我的 expandoobject,如下所示:

Dim test As Object = new ExpandoObject
  AddHandler CType(test, INotifyPropertyChanged).PropertyChanged, AddressOf expando_PropertyChanged

处理程序是最基本的

Public Shared Sub expando_PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs)
    Debug.Print("Property {0} set or changed", e.PropertyName)
End Sub

到目前为止,如果我在此之后添加或修改属性,我会收到通知。 但是,如果我返回它并将其设置为我的 propertygrid 的选定对象,我将无法触发该事件。

我正在使用自定义 PropertyDescriptor 和 ICustomTypeDescriptor 为 propertygrid 设置一些其他属性,所以我认为它可能像设置属性一样简单

<RefreshProperties(RefreshProperties.All)>

但我无法找到一种方法来覆盖 PropertyDescriptor 中的 Refresh,这与 Browsable 或 readonly 不同,这有点道理,因为属性网格需要提前知道它需要可刷新。

【问题讨论】:

  • 到目前为止,我发现的唯一途径是从使用 expandoobject 转换为实现我自己的动态对象并实现 INotifyPropertyChanged,我不确定这是否能解决问题(而且我已经花了很多使用 expando 建立时间)
  • 您能否使用继承 ExpandoObject 并实现 INotififiable 的自定义类?
  • expando 不能被继承并且已经实现了 Inotif。这就是为什么我正在考虑动态对象

标签: vb.net propertygrid expandoobject


【解决方案1】:

所以我无法使 INotifyPropertyChanged 与 expando 一起工作,它可以与我自己实现的 dynamicObject 一起工作,但这对我来说需要太多的重写。

我最终在我的 expando 上添加了一个 lambda,我在 PropertyDescriptor SetValue 上调用它

      CType(_expando, Object).toggleSwitches.Invoke(_expando, _name, value)

请注意在 vb.net 中使用 Invoke,这也是一个 PITA,但我发现这个人与我有同样的问题:https://github.com/dotnet/vblang/issues/226 没有必要在 C# 中使用 invoke,因为 99% 的示例都是在 C# 中,所以我花费的时间比我想要实现它的时间要长。

希望这对某人也有帮助。

如果有兴趣,这里是 lambda:

Dim toggleSwitches = Sub(obj As Object, caller As String, value As Object)
                       Debug.Print(caller & " " & value.ToString())
                     End Sub

_expando.toggleSwitches = toggleSwitches

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2011-02-08
    • 2015-09-24
    相关资源
    最近更新 更多