基本上我正在加載一個 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 不同,這有點道理,因為屬性網格需要提前知道它需要可重繪 。
uj5u.com熱心網友回復:
因此,我無法使 INotifyPropertyChanged 與 expando 一起使用,它可以與我自己實作的 dynamicObject 一起使用,但這對我來說需要太多的重寫。
我最終在我呼叫 PropertyDescriptor SetValue 的 expando 上添加了一個 lambda
CType(_expando, Object).toggleSwitches.Invoke(_expando, _name, value)
注意在 vb.net 中使用 Invoke,這也是一個 PITA,但我發現這個人和我有同樣的問題:https ://github.com/dotnet/vblang/issues/226 沒有必要使用在 C# 中呼叫,因為 99% 的示例都是在 C# 中,所以我花了比我想要實作它更多的時間。
希望這也會對某人有所幫助。
如果也有興趣,這里是 lambda:
_expando.toggleSwitches = Sub(obj As Object, caller As String, value As Object)
Debug.Print(caller & " " & value.ToString())
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/490847.html
上一篇:構建訊息
