从WPF ListBox中的单个列表中显示多个类型?
我有一个ObservableCollection
,它包含两种不同的类型。
我想将此列表绑定到ListBox并为遇到的每种类型显示不同的DataTemplate。 我无法弄清楚如何根据类型自动切换数据模板。
我试图使用DataTemplate的DataType属性并尝试使用ControlTemplates和DataTrigger,但无济于事,或者它没有显示,或者它声称它找不到我的类型……
示例尝试如下:
我现在只有一个数据模板连接到ListBox,但即使这样也行不通。
XAML:
代码背后:
public class Person { public string Name { get; set; } public Person(string name) { Name = name; } } public class Quantity { public int Amount { get; set; } public Quantity(int amount) { Amount = amount; } } public partial class Window1 : Window { ObservableCollection ListToBind = new ObservableCollection(); public Window1() { InitializeComponent(); ListToBind.Add(new Person("Name1")); ListToBind.Add(new Person("Name2")); ListToBind.Add(new Quantity(123)); ListToBind.Add(new Person("Name3")); ListToBind.Add(new Person("Name4")); ListToBind.Add(new Quantity(456)); ListToBind.Add(new Person("Name5")); ListToBind.Add(new Quantity(789)); } }
你说“它声称找不到我的类型。” 这是你应该解决的问题。
最有可能的问题是,您没有在XAML中创建引用CLR名称空间和程序集的名称空间声明。 你需要在XAML的顶级元素中加入这样的东西:
xmlns:foo="clr-namespace:MyNamespaceName;assembly=MyAssemblyName"
执行此操作后,XAML将知道具有XML名称空间前缀foo
任何内容实际上是MyNamespaceName
名称空间中MyAssemblyName
中的MyNamespaceName
。
然后,您可以在创建DataTemplate
的标记中引用该XML命名空间:
你当然可以构建一个模板选择器,但这会为你的软件添加一些不需要的东西。 WPF应用程序中有模板选择器的位置,但不是这样。
您必须使用DataTemplateSelector 。 请看这里的例子。
MSDN上的附加信息