РЕДАКТИРОВАТЬ: Решение в коде можно найти внизу.
Я не уверен, что я "ошибаюсь". Предположим, у меня есть ListBox
, и я хочу добавить другие вещи к этому ListBox
. Конечно, я знаю, что мог бы изменить ItemTemplate
, добавить к нему привязку данных, чтобы отобразить мои собственные классы.
Но это для "особенных". Я ищу способ создания «по умолчанию» для моего DataWrapper
, независимо от того, где он используется.
Если я пытаюсь создать стиль для него, он жалуется, что класс не происходит от FrameworkElement
. Хорошо, простой способ, сделать DataWrapper
потомком FrameworkElement
. Но это «кажется неправильным», так как это бизнес-объект, а не элемент пользовательского интерфейса.
Я немного застрял, я знаю, что должен быть способ сообщить WPF, как отображать элементы, которые он не знает. В настоящее время отображается полное имя класса.
Итак, как проще всего получить, например? DataWrapper
как TextBlock
с зеленым фоном, DataWrapper2
как TextBlock
с синим фоном. Отображение строки данных.
Я знаю связывание и все такое, я просто застрял в том, как сказать 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;
}
}