2013-08-20 64 views
2

我有DataContext的一個窗口設置爲自己與這個簡單的XAML佈局的工作方式不同。私人依賴屬性綁定相比,私人CLR屬性

private string NameCLR 
    { 
     get { return "CLRProperty"; } 
    } 

    private string NameDP 
    { 
     get { return (string)GetValue(NameDPProperty); } 
     set { SetValue(NameDPProperty, value); } 
    } 

    private static readonly DependencyProperty NameDPProperty = 
     DependencyProperty.Register("NameDP", typeof(string), typeof(MainWindow), 
             new UIPropertyMetadata("DPProperty")); 

由於代碼隱藏是部分類定義,部分是XAML。所以,我認爲私有財產應該對XAML可見。但令我驚訝的是,CLR和DP的行爲有所不同。

私有依賴屬性是可訪問的,但私有CLR屬性 不是。

我得到的輸出 - 的

DPProperty 

代替

CLRProperty 
DPProperty 

有人可以讓我知道在DP和CLR屬性與此不同的行爲?

回答

5

綁定屬性由綁定訪問,而不是由聲明類訪問。像NameCLR這樣的私人CLR資源無法訪問,因此綁定無效。

但是,解析屬性路徑NameDP時,Binding顯然繞過該屬性的CLR包裝並直接訪問通過調用DependencyProperty.Register向依賴屬性系統註冊的基礎依賴屬性。您是否已將返回的DependencyProperty引用分配給您的類中的私有或公共靜態字段是無關緊要的。依賴項屬性已爲您的課程註冊,因此可以查找它。

從鏈接here -

上的給定類型

依賴屬性是爲存儲 表通過屬性系統訪問,所述WPF執行其XAML 處理器的使用該表和推斷任何給定的屬性可以通過使用依賴項屬性 標識符ABCProperty在包含 DependencyObject派生類型上調用SetValue來更有效地設置ABC可以 。

+2

這對了解另一個原因很重要;由於綁定系統直接使用依賴項屬性,它將永遠不會調用暴露在類上的「友好包裝器」標準屬性的getter和setter。在setter中爲這個包裝屬性放置一些特殊的邏輯是一個非常常見的錯誤,只有在Binding系統更新值時纔會發現它沒有被調用。 –

+1

@Clemens - 'CLR屬性不能被訪問,因爲屬性查找是通過綁定完成的 - - 足夠公平。但正如提到的綁定將訪問我標記爲私有的底層靜態DP屬性標識符。那麼,它將如何被訪問? –

+1

@RohitVats不,綁定不會訪問你的'private static'字段。它將直接從依賴屬性系統獲取屬性值。直接訪問靜態字段不會工作,因爲它是靜態的,因此不會與任何類的實例關聯。 – Clemens