Ответ 1
Просто указать DataTemplates
в Resources
с соответствующим DataType
, например
<ListView ItemsSource="{Binding Data}">
<ListView.Resources>
<!-- Do NOT set the x:Key -->
<DataTemplate DataType="{x:Type local:Employee}">
<TextBlock Text="{Binding Name}" Foreground="Blue"/>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Machine}">
<TextBlock Text="{Binding Model}" Foreground="Red"/>
</DataTemplate>
</ListView.Resources>
</ListView>
(Обратите внимание, что DataTemplate.DataType
также может использоваться для неявного шаблона данных XML (см. документы), тип свойства по этой причине not System.Type
, поэтому в отличие от Style.TargetType
вам нужно использовать x:Type
для ссылки на CLR-тип. Если вы просто вводите строку, она не будет преобразована в тип.)
Вы также можете просмотреть CompositeCollections
, чтобы получить чистые объединенные списки разных типов.
Примеры данных, которые я использовал:
ObservableCollection<Employee> data = new ObservableCollection<Employee>(new Employee[]
{
new Employee("Hans", "Programmer") ,
new Employee("Elister", "Programmer") ,
new Employee("Steve", "GUI Designer") ,
new Employee("Stephen", "GUI Designer") ,
new Employee("Joe", "Coffee Getter") ,
new Employee("Julien", "Programmer") ,
new Employee("John", "Coffee Getter") ,
});
ObservableCollection<Machine> data2 = new ObservableCollection<Machine>(new Machine[]
{
new Machine("XI2", String.Empty),
new Machine("MK2-xx", String.Empty),
new Machine("A2-B16", String.Empty),
});
CompositeCollection cc1 = new CompositeCollection();
cc1.Add(new CollectionContainer() { Collection = data });
cc1.Add(new CollectionContainer() { Collection = data2 });
Data = cc1;