想象一下,這些屬性被鍵入爲UIElements(或其他一些WPF特定對象)。如何將對象添加到不是UIElements的控件?
你將不得不提供從WPF對象派生出來的包裝器,這些對象公開你需要的信息。大多數情況下,包裝只會簡單地調用ToString()被包裝的對象。看作你將使用的大多數類型提供了一個足夠好的默認實現ToString()只需調用它而不是讓開發人員爲所有內容編寫包裝都是有意義的。
其次,想象一下,如果它們被鍵入爲某個界面。如果你想傳達這個接口不能做的事情呢?唯一的選擇是(a)開發人員在框架的限制下工作,或者(b)Microsoft更新接口並打破已寫入的所有現有代碼。
另外考慮如果你使用的是像MVVM這樣的模式。當前的設計意味着您的視圖模型可以以任何方式暴露與WPF無關的屬性,最終使您的代碼在不同技術之間更具可重用性。
最後,請記住表示該屬性的對象與WPF呈現該信息的方式之間存在差異。例如。如果使用基本類型,如System.String,WPF將創建一個文本塊並將文本屬性設置爲的結果ToString()。這允許由UI顯示的數據與它們通過UI呈現的信息是呈現之間的非常乾淨的分隔。
舉一個簡單的類,它表示一個菜單項,例如:
public class MenuItem
{
public string Text { get; set; }
public bool IsChecked { get; set; }
public bool IsEnabled { get; set; }
}
這種類型僅公開數據有關的菜單項,也沒有這方面的信息應該如何呈現的信息。實際上,除了類的名稱(MenuItem)之外,它甚至不是特定於菜單項的,並且相同的數據可以在另一個UI控件中使用,例如選中的列表框,無需進行任何更改。如果該類暴露了WPF特定的用戶界面元素,那麼這些信息需要根據每個不同的用戶界面控件進行調整。
我認爲這很酷,但不是對象必須是某種UI元素? TextBox和Image都是FrameworkElements。我所看到的唯一可以分配的不是FrameworkElement是一個String ...是唯一的東西嗎?如果是這樣,它似乎不是一個很好的理由,因爲我可以在我的字符串周圍創建一個標籤或包裝。 – Trevor
@Rovert不,它取決於屬性,如果有一個視覺方面,WPF將其轉換爲圖像的方式,那麼它會顯示。您可以將*任何*分配給對象。我相信這是Xaml標記工作所需的[TypeConversion](http://msdn.microsoft.com/en-us/library/aa970913.aspx)的一個副產品。 –
關於TypeConversion的有趣點。這實際上對於它如何以及如何決定它可以顯示出更多的意義。例如,尋找ImageSource來弄清楚它們如何工作會導致巨大的困惑,但現在我知道必須在幕後進行一些動態行爲。謝謝! – Trevor