![](/img/trans.png)
[英]Convert DateTime with TypeDescriptor.GetConverter.ConvertFromString (using custom format)
[英]Custom TypeDescriptor and AddValueChange/OnValueChanged
當WPF控件上的數據綁定屬性設置CLR屬性時,我正在探索使用自定義TypeDescriptors
進行攔截。 由於種種原因,我需要弄清楚哪個確切的控件正在設置一個值。
如果我使用INotifyPropertyChanged
,則將獲得所有不同的控件,這些控件可訂閱視圖模型中的任何屬性,但並不是全部有用。 所以我想我會沿着自定義TypeDescriptor
路徑嘗試ProperyDescriptor.AddValueChanged
和PropertyDescriptor.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.