2010-11-19 59 views
34

只是一個簡短的問題,澄清一些疑惑。元素綁定到依賴項屬性時,setter是否不運行?Setters不在依賴屬性上運行?

public string TextContent 
{ 
    get { return (string)GetValue(TextContentProperty); } 
    set { SetValue(TextContentProperty, value); Debug.WriteLine("Setting value of TextContent: " + value); } 
} 

public static readonly DependencyProperty TextContentProperty = 
    DependencyProperty.Register("TextContent", typeof(string), typeof(MarkdownEditor), new UIPropertyMetadata("")); 

...

<TextBox Text="{Binding TextContent}" /> 

正如我注意到下面我二傳手不運行

Debug.WriteLine("Setting value of TextContent: " + value); 
+0

如果在二傳手把斷點,可以看到它被設置。 – VoodooChild 2010-11-19 13:24:07

+4

如果您在設置屬性時需要執行代碼,請查看UIMetadata類的CoerceValueCallback或ValueChangedCallback。 – Jens 2010-11-19 14:04:56

+0

可能重複[WPF:XAML屬性聲明不是通過Setters?](http://stackoverflow.com/questions/3836076/wpf-xaml-property-declarations-not-being-set-via-setters) – 2015-09-14 13:30:57

回答

46

的WPF綁定引擎調用GetValueSetValue直接(繞過屬性setter和干將)。您需要該屬性以便在XAML標記中支持(並正確編譯)。

+0

嗨,我不確定明白你說什麼? – Emixam23 2016-09-11 17:01:20

+0

@ Emixam23 Dean說OP不能在TextContent屬性中放置調試語句來確定DP是否被正確綁定,因爲WPF將調用SetValue而不是TextContent設置器。 – Dave 2016-12-06 23:26:45

34

要創建DependencyProperty,請將類型爲DepdencyProperty的靜態字段添加到您的類型中,並調用DependencyProperty.Register()以創建依賴項屬性的實例。 DependendyProperty的名稱必須始終以... Property結尾。這是WPF中的命名約定。

爲了使它作爲普通的.NET屬性可訪問,您需要添加一個屬性包裝器。該包裝除了通過使用從DependencyObject繼承的GetValue()和SetValue()方法並將DependencyProperty作爲關鍵字傳遞來進行內部獲取和設置值外,沒有別的。

不要爲這些屬性添加任何邏輯,因爲只有在您從代碼設置屬性時才調用它們。如果從XAML設置屬性,則直接調用SetValue()方法。

每個DependencyProperty都爲更改通知,值強制和驗證提供回調。這些回調被註冊在依賴屬性上。

來源:http://www.wpftutorial.net/DependencyProperties.html

+0

你救了我的命! – j00hi 2017-06-06 09:24:07