簡體   English   中英

自定義TypeDescriptor和AddValueChange / OnValueChanged

[英]Custom TypeDescriptor and AddValueChange/OnValueChanged

當WPF控件上的數據綁定屬性設置CLR屬性時,我正在探索使用自定義TypeDescriptors進行攔截。 由於種種原因,我需要弄清楚哪個確切的控件正在設置一個值。

如果我使用INotifyPropertyChanged ,則將獲得所有不同的控件,這些控件可訂閱視圖模型中的任何屬性,但並不是全部有用。 所以我想我會沿着自定義TypeDescriptor路徑嘗試ProperyDescriptor.AddValueChangedPropertyDescriptor.OnValueChanged方法。

我可以看到WPF按預期方式調用ProperyDescriptor.AddValueChanged ,但是我對ProperyDescriptor.OnValueChanged的調用似乎從未觸發過PropertyDescriptor.GetValue的調用以及UI中的更新。

使用我缺少的這些東西有一些陷阱嗎? 或者,還有其他方法可以確定誰在訂閱CLR屬性。 我現在看到的替代方法是為整個shebang發出自定義代理,但我非常希望不必這樣做。

編輯:在仔細觀察時,我注意到通過PropertyDescriptor.AddValueChanged獲得的委托轉到一些內部MS幫助器類,因此如果沒有一些不可靠的反射,則無法使用它來獲取源代碼控制。 我認為我必須使用具有依賴項屬性的自定義代理。

有一種可能有用的替代方法。 在綁定中,可以將NotifyOnSourceUpdated設置為True ,這將在WPF更新數據綁定到的CLR屬性時引發控件的SourceUpdated事件。 例如,在TextBox您可以編寫:

<TextBox
    Text="{Binding MyText, NotifyOnSourceUpdated=True}"
    SourceUpdated="TextBox_OnSourceUpdated"
    />

在后面的代碼中,您可以獲得確切的控件( sender )和更新CLR屬性的依賴項屬性的名稱:

private void TextBox_OnSourceUpdated(object sender, DataTransferEventArgs e)
{
    var control = (TextBox)sender;
    var propertyName = e.Property.Name;
}

使用這種方法,您需要知道該控件是TextBox ,但是您可能可以對其進行更新以測試各種控件。 實際上,這取決於您需要什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM