从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上的附加信息