WPF - автоматическое форматирование пользовательских типов, как? (ControlTemplate, Style ..) - PullRequest
1 голос
/ 13 ноября 2009

РЕДАКТИРОВАТЬ: Решение в коде можно найти внизу.

Я не уверен, что я "ошибаюсь". Предположим, у меня есть 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;
    }
}

1 Ответ

2 голосов
/ 13 ноября 2009

См. DataTemplate.DataType . Из документов: «Когда вы устанавливаете это свойство для типа данных без указания x: Key, DataTemplate автоматически применяется к объектам данных этого типа».

Для более точного управления вы также можете использовать DataTemplateSelector .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...