2009-09-23 113 views
2

有沒有辦法知道第一次通過XAML綁定訪問Dependency屬性,所以我實際上可以在需要時「呈現」屬性的值?延遲「呈現」WPF/Silverlight依賴屬性?

我有一個對象(派生自Control的類)有幾個PointCollection依賴屬性可能包含100或1000的點。每個屬性都可以按照不同類型的形狀(Polyline,Polygon等等)使用不同的方式來安排點 - 它比這更復雜,但你明白了)。通過模板,不同的XAML對象使用TemplateBinding來訪問這些屬性。由於我的對象使用模板,我永遠不知道XAML形狀可能會用於我的對象 - 所以我永遠不知道它們可能綁定或不綁定到的屬性。我只想在實際需要時填入這些PointCollections。

通常在.NET中,我只想在Property的getter中添加一些邏輯,但是這些邏輯被XAML數據綁定繞過。

我需要一個WPF和Silverlight兼容的解決方案。

我很喜歡這個解決方案,可以避免爲我的對象的用戶帶來額外的複雜性。


更新我發現這樣做是使用Value Converters

的一種方式。在我的情況下,我有多個點集合。有一個主要的部門。包含數據通常形狀的屬性。需要在其他區域/上下文中重複使用兩種替代形狀。

起初我有3局。道具。但是,我可能只有一個屬性(通常的形狀),並使用轉換後的值將這些點轉換爲其他2個所需的形狀。這樣做,我只能在控件中創建一組點。將點轉換爲次形狀的費用僅在使用時發生。現在,我的主要控件不需要預測數據如何查找控件上引發的每個可能的模板 - 現在是模板設計器的問題。


更新2

當然INotifyPropertyChanged的和經常性的來處理這個推薦的方法。

回答

3

您不一定必須使用依賴項屬性來啓用數據綁定。但是,如果將源處的更改傳播到綁定的目標,則必須實施INotifyPropertyChanged。 「正常」 .NET屬性是很容易延遲加載或許是這樣的:

PointCollection points 

public PointCollection Points { 
    get { 
    return this.points ?? (this.points = CreatePoints()); 
    } 
} 

PointCollection CreatePoints() { 
    // ... 
} 

我不知道你如何適應INotifyPropertyChanged到你的控制,但它聽起來有點怪,你的控制數據提供給其他系統的一部分。也許你需要創建一個包含數據的視圖模型,然後你可以讓你的控件數據綁定。

+0

我仍然在試圖弄清爲什麼這種解決方案不適合我的情況。也許這在綁定模板時不起作用? – Aardvark 2009-10-04 22:46:31

0

如果我套用你給

如何得到通知問題,當依賴屬性發生變化?

這是正確的嗎?我從你的短語中「通常在.NET中,我會但是在屬性的getter中的一些邏輯,但這些被邏輯XAML數據綁定繞過」。

如果我是正確的,那麼你可以註冊你自己的屬性改變回調。它總是被稱爲。引起更改綁定,樣式或觸發器的人無關緊要。下面的代碼片段從MSDN文章 「Dependency Property Callbacks and Validation」 採取:

public static readonly DependencyProperty CurrentReadingProperty = 

    DependencyProperty.Register(
     "CurrentReading", 
     typeof(double), 
     typeof(Gauge), 
     new FrameworkPropertyMetadata(
      Double.NaN, 
      FrameworkPropertyMetadataOptions.AffectsMeasure, 
      new PropertyChangedCallback(OnCurrentReadingChanged), 
      new CoerceValueCallback(CoerceCurrentReading) 
     ), 
     new ValidateValueCallback(IsValidReading) 
    ); 
    public double CurrentReading 
    { 
     get { return (double)GetValue(CurrentReadingProperty); } 
     set { SetValue(CurrentReadingProperty, value); } 
    } 

你這裏的外賣是OnCurrentReadingChanged()方法。希望這可以幫助 :)。

+1

我敢肯定,問題是關於如何在對象中第一次訪問 時「延遲加載」依賴項屬性的值,而不是在依賴項屬性發生更改時如何獲得通知。 – 2009-09-23 16:21:10

+0

Martin說了什麼...... – Aardvark 2009-09-23 17:07:54