2009-11-12 44 views
1

編輯:代碼中的解決方案可以在底部找到。WPF - 自動格式化自定義類型如何? (ControlTemplate,Style ..)

我不確定我是否「思考錯誤」。假設我有一個ListBox,我想添加不同的東西到這個ListBox。當然,我知道我可以更改ItemTemplate,添加一些數據綁定到它,以顯示我的自定義類。

但這是「特殊」的。我正在尋找一種方法來爲我的DataWrapper創建「默認」外觀,而不依賴於它的使用位置。

如果我試圖爲它創建一個風格,他在抱怨說這個類不會從FrameworkElement下降。好吧,簡單的方法,讓DataWrapperFrameworkElement。但是這「感覺不對」,因爲這是一個業務對象,而不是UI元素。

我有點卡住了,我知道必須有辦法告訴WPF如何呈現它不知道的元素。目前它顯示完整的課程名稱。

那麼最簡單的方法是什麼? DataWrapperTextBlock綠色背景,DataWrapper2TextBlock藍色背景。顯示數據字符串。 我知道綁定和所有這些東西,我只是堅持如何告訴WPF:

如果你的一個孩子是DataWrapper,請用這種方法渲染它。如果是DataWrapper2,請渲染這樣...

這裏是一些試用代碼:

public class DataWrapper 
{ 
    public string Data { get; set; } 
} 

public class DataWrapper2 
{ 
    public string Data { get; set; } 
} 

public static class ListBoxTest 
{ 
    public static ListBox CreateTestInstance() 
    { 
     var lB = new ListBox(); 

     var items = new ObservableCollection<object> 
         { 
          23.5, 
          "Hello World", 
          new Button() {Content = "Click me"}, 
          new DataWrapper() {Data = "Some text"}, 
          new DataWrapper2() {Data = "Other text"}, 
          "string again" 
         }; 

     lB.ItemsSource = items; 

     var dT = CreateDataTemplate(); 

     lB.Resources.Add(dT.DataTemplateKey, dT); 
     return lB; 
    } 

    public static DataTemplate CreateDataTemplate() 
    { 
     var dT = new DataTemplate(typeof(DataWrapper)); 
     var elementFactory = new FrameworkElementFactory(typeof(TextBlock)); 
     elementFactory.SetBinding(TextBlock.TextProperty, new Binding("Data")); 

     dT.VisualTree = elementFactory; 

     return dT; 
    } 
} 

回答

2

DataTemplate.DataType。從文檔:「當您將此屬性設置爲數據類型而未指定x:Key時,DataTemplate會自動應用於該類型的數據對象。」

爲了更好地控制,您還可以使用DataTemplateSelector

+0

謝謝,我知道這並不難。剛剛在我所有的試用中迷失了一點...更新後的代碼,如果有人想知道如何.. – 2009-11-12 22:07:28