2011-02-09 105 views
3

我做了一個用戶控件,它工作的很好,但是當我把這個控件的兩個實例放到一個窗口中時,只有最後一個工作。我試圖找到解決方案,我意識到,依賴屬性是共享的,但我不知道如何得到它的工作。WPF:用戶控件共享依賴項屬性的實例

這裏是我的依賴屬性:

public double AnimatingVerticalOffset 
    { 
     get { return (double)GetValue(AnimatingVerticalOffsetProperty); } 
     set { SetValue(AnimatingVerticalOffsetProperty, value); } 
    } 

    public static readonly DependencyProperty AnimatingVerticalOffsetProperty; 

    static ListChooser() 
    { 
     ListChooser.AnimatingVerticalOffsetProperty = 
        DependencyProperty.Register("AnimatingVerticalOffset", typeof(double), typeof(ListChooser), new UIPropertyMetadata(OnAnimationVerticalOffsetChanged)); 
    } 
+0

@user:你能解釋一下爲什麼你的依賴項屬性是「共享的」嗎?您發佈的代碼看起來正確,沒有更多示例,我不確定您遇到了什麼問題。 – 2011-02-10 09:54:16

+0

嗨,這裏是我的問題:當我用這個組件的更多實例啓動窗口時,只有最後創建的實例更改了依賴項屬性。其餘的看到由最後一個實例設置的值,但不能設置該屬性。沒有例外或其他的東西只是不起作用。 – JanSkalicky 2011-02-11 10:43:01

回答

2

依賴屬性本身必須是靜態的,沒有聯繫到一個單一實例。這也適用於它的回調(OnAnimationVerticalOffsetChanged在你的情況) - 這些必須是靜態方法(不要擔心,對象實例通過它的參數傳遞,你只需要做一些類型轉換來確保對象是你的類型正在合作)。

您應該使用靜態初始化程序來初始化DP,您使用的方法(在構造函數中初始化)可以工作,但DP將爲每個實例覆蓋。

See this question for deeper explanation.

編輯:

更正代碼:

public double AnimatingVerticalOffset 
{ 
    get { return (double)GetValue(AnimatingVerticalOffsetProperty); } 
    set { SetValue(AnimatingVerticalOffsetProperty, value); } 
} 

public static readonly DependencyProperty AnimatingVerticalOffsetProperty = 
       DependencyProperty.Register("AnimatingVerticalOffset", typeof(double), typeof(ListChooser), new UIPropertyMetadata(OnAnimationVerticalOffsetChanged)); 

static ListChooser() 
{ 
} 

如果回調也不是一成不變的,你會得到編譯錯誤(=>您必須使它靜態)。

編輯:

記住,DP定義是靜態的,而不是屬性的值本身! DP的工作原理與其他任何屬性一樣,它只是具有一些額外的功能:價值inheightiance,投標,動畫...