2011-03-22 71 views
1

好吧,所以這只是一個想法,在我的腦海中浮現出一種'僞只寫'依賴屬性。我說排序,因爲我其實不想要存儲的值,而是我想要傳遞給setter的值設置其他屬性。作爲一個假設的例子,我想做到這一點...如何編寫僞只寫依賴項屬性?

<button UIHelper.Bounds="10,10,40,20" /> 

,而不是這個......

<button Canvas.Left="10" Canvas.Top="10" Width="40" Height="20" /> 

只是一個XAML打字方便的事情,讓我設置的實際四個屬性更容易打字,這要歸功於說一個只寫的附屬屬性。沿着摺疊CSS規則的方式思考。實際上,爲了這個效果,這裏的另一個...

<border UIHelper.BrushSpec="AliceBlue Red 2 4" /> 

的,而不是...

<border Background="AliceBlue" BorderBrush="Red" BorderThickness="2" CornerRadius="4" /> 

現在使用的第一爲例,一個想法是在內部存儲這樣的結構,然後同步它與現有的寬度,高度,Canvas.Left和Canvas.Top屬性,但我真的不打算讀回它,所以不需要。 (從技術上講,我可以完全忽略它的存儲,只需在propertychanged處理程序中調用ClearValue,但再次,它不是真正的讀取它,所以這只是爲了一致性。)

技術上我甚至不想/需要這個除了我的理解是如果你需要從XAML設置它,它必須是一個DP,因此我以後是DP。這將是完美的,如果我們可以設置一個直接的.NET屬性,因爲我可以設置實現,並根據需要進行自我重構,但是我知道您不能從XAML訪問.NET屬性,米回到這裏。

現在是我知道這個概念會經很多人,尤其是XAML較真地皺起了眉頭,但我問如何爲什麼因此,如果沒有其他原因,考慮「這一演習它可以做'不'應該完成'。我甚至不建議這是我將使用的。我只是想更好地理解DP和XAML的限制,我發現這樣的練習確實很有幫助。

所以,想法??

中號

回答

0

而不去編寫自己的XAML編譯器的極限,我認爲你能做的最好的是附加屬性,設置你感興趣的基於您定義的一些緊湊語法的屬性組。是的,這意味着您已經爲緊湊型表示分配了存儲空間,但正如您所說,您可以在應用後立即清除它。這將有點不正統,但它在技術上會起作用。

你也可以嘗試不聲明一個附加的屬性字段,以便通過get/set方法訪問該值(還沒有嘗試過這一點,但我相信它在DP是私人的時候可以工作,所以也許這樣做工作)。通過這種方式,您實際上也可以讀取它,而不會聆聽相關屬性更改的麻煩。當然,這意味着你的財產將不會有改變的通知:

public static string GetBounds(UIElement uiElement) 
{ 
    return Canvas.GetLeft(uiElement) + "," + ...; 
} 

public static void SetBounds(UIElement uiElement, string compact) 
{ 
    // parse and apply compact 
} 

我只是把緊湊表示在上方string,但你可能想使用一個特定的類型。同樣,上述可能不起作用 - 您可能需要關聯的DependencyProperty實例。如果我在Windows機器上,我會嘗試它。

+0

是的,我敢肯定你的後一條評論不會出於我上面提到的原因......你不能從XAML訪問非DP屬性。實際上,他們(MS)特別警告不要在.NET屬性獲取器或設置器中放置任何代碼,因爲它們在通過其XAML對等設備訪問時完全繞過。至於你的第一部分,那正是我上面所描述的。 – MarqueIV 2011-03-23 00:12:54