您可以创建多个ObservableCollections
,并将您的ItemsSource
绑定到一个CompositeCollection
,它可以连接这些集合。
然后在您的XAML中,可以使用DataType
属性为相应类型创建不同的DataTemplates
。如果将其放置在资源中,它会像样式一样自动应用。(您也可以在XAML中创建组合,该组合在MSDN上有显示,但如果应该绑定CollectionContainers
,则会更加困难)
示例代码:
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>
我这里使用的是一个不同的面板,但对于画布(canvas)应该是相同的。
WPF
和Silverlight
。 - vortexwolf