编辑:代码中的解决方案可以在底部找到。
我不确定我是否“想错了”。假设我有一个ListBox
,我想为此ListBox
添加不同的内容。当然,我知道我可以更改ItemTemplate
,添加一些数据绑定到它,以显示我的自定义类。
但这是“特殊的”。我正在寻找一种为DataWrapper
创建“默认”外观的方法,与其使用位置无关。
如果我尝试为它创建一个样式,他抱怨该类不会从FrameworkElement
下降。好的,简单的方法,让DataWrapper
成为FrameworkElement
的孩子。但这“感觉不对”,因为这是一个业务对象,而不是UI元素。
我有点陷入困境,我知道必须有办法告诉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;
}
}
答案 0 :(得分:2)
见DataTemplate.DataType。从文档:“当您将此属性设置为数据类型而未指定x:Key时,DataTemplate将自动应用于该类型的数据对象。”
为了更好地控制,您还可以使用DataTemplateSelector。