You can create multiple ObservableCollections
and then bind your ItemsSource
to a CompositeCollection
which joins those collections.
Then in your XAML you can create different DataTemplates
for the respective types using the DataType
property which like styles gets automatically applied if it is placed in the resources. (You can also create the composite in XAML which is shown on MSDN, if the CollectionContainers
should be bound that is a bit more difficult though)
Example code:
ObservableCollection<Employee> data1 = new ObservableCollection<Employee>(new Employee[]
{
new Employee("Hans", "Programmer"),
new Employee("Elister", "Programmer"),
new Employee("Steve", "GUI Designer"),
new Employee("Stefan", "GUI Designer"),
new Employee("Joe", "Coffee Getter"),
new Employee("Julien", "Programmer"),
});
ObservableCollection<Machine> data2 = new ObservableCollection<Machine>(new Machine[]
{
new Machine("E12", "GreedCorp"),
new Machine("E11", "GreedCorp"),
new Machine("F1-MII", "CommerceComp"),
new Machine("F2-E5", "CommerceComp")
});
CompositeCollection coll = new CompositeCollection();
coll.Add(new CollectionContainer() { Collection = data1 });
coll.Add(new CollectionContainer() { Collection = data2 });
Data = coll;
<ItemsControl ItemsSource="{Binding Data}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Resources>
<DataTemplate DataType="{x:Type local:Employee}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text=" ("/>
<TextBlock Text="{Binding Occupation}"/>
<TextBlock Text=")"/>
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type local:Machine}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Model}"/>
<TextBlock Text=" - "/>
<TextBlock Text="{Binding Manufacturer}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.Resources>
</ItemsControl>
Here i use a different panel but it should be the same for a canvas.
WPF
andSilverlight
. – Twicetold