WPF - 自动格式化自定义类型如何? (ControlTemplate,Style ..)

时间:2009-11-12 21:41:52

标签: wpf styles

编辑:代码中的解决方案可以在底部找到。

我不确定我是否“想错了”。假设我有一个ListBox,我想为此ListBox添加不同的内容。当然,我知道我可以更改ItemTemplate,添加一些数据绑定到它,以显示我的自定义类。

但这是“特殊的”。我正在寻找一种为DataWrapper创建“默认”外观的方法,与其使用位置无关。

如果我尝试为它创建一个样式,他抱怨该类不会从FrameworkElement下降。好的,简单的方法,让DataWrapper成为FrameworkElement的孩子。但这“感觉不对”,因为这是一个业务对象,而不是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;
    }
}

1 个答案:

答案 0 :(得分:2)

DataTemplate.DataType。从文档:“当您将此属性设置为数据类型而未指定x:Key时,DataTemplate将自动应用于该类型的数据对象。”

为了更好地控制,您还可以使用DataTemplateSelector