2010-09-07 65 views
4

是否有任何理由不能將(或者應該)聲明依賴項屬性爲非靜態?非靜態依賴項屬性

我需要製作一個雙向可綁定屬性的接口。 INotifyPropertyChanged在接收端似乎有點麻煩,因爲它依賴於字符串標識符。

回答

10

是否有任何理由爲什麼我可以(或應該)不聲明依賴項屬性爲非靜態?

是的。

WPF中的依賴屬性機制使用每種類型指定的存儲機制,而不是每個實例。 DP的設計依賴於它們的靜態定義,而不是每個實例。如果您在實例中定義它們,它們將無法正常工作。

這部分完成允許繼承屬性,但也允許您在一個對象上指定很多屬性,而無需每個實例使用大量內存。

如果要製作具有雙向可綁定屬性的接口,通常您希望對您的類使用INotifyPropertyChanged,並且需要用戶界面元素上的依賴項屬性來處理綁定。 INotifyPropertyChanged是適當的機制。如果主要投訴是字符串標識符,您可以work around them using expression trees

+0

感謝您的回覆,我不知道內部如何執行DP。一個屬性是DP還是可以同時實現INotifyPropertyChanged(DP用於XAML UI,另一個是通過接口公開)? – 2010-09-07 16:53:54

+2

@commanderz:是的,雖然通常情況下,您將在UI元素上使用DP,在「模型」對象上使用INPC,這應該是您的UI的DataContext。你可以將兩者都放在同一個對象上,但這通常不是一個好主意,因爲分開你的顧慮更好。 – 2010-09-07 16:54:52

+2

@commanderz:嘗試將應用程序邏輯(實現INPC)與UI(使用DP)分開, – 2010-09-07 16:55:17

0

DependencyProperty字段本身需要聲明爲靜態,包含GetValue/SetValue調用的包裝器屬性不是。

依賴屬性具有更改內置的通知,所以你不需要做任何額外的事情來獲得它。要使屬性上的綁定默認爲Mode = TwoWay,請使用選項中的FrameworkPropertyMetadataOptions.BindsToWayByDefault標誌將FrameworkPropertyMetadata傳遞給Register方法。