首先,你需要你的Item
对象的集合转换成适合的收集:
var dict = data.Select(i => i.UnitId).Distinct()
.ToDictionary(u => u, u => data
.Where(i => i.UnitId == u)
.ToDictionary(d => d.RoomId, d => d));
var rooms = dict.Values.First().Keys;
DataContext = Tuple.Create(dict, rooms);
,然后你需要用正确的DataTemplate
配置的ItemsControl
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ItemsControl ItemsSource="{Binding Item2}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"
Margin="80,0,0,0" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Center"
Foreground="Blue"
Width="80"
Margin="5">
<Run Text="Room" />
<Run Text="{Binding Mode=OneWay}" />
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{Binding Item1}"
AlternationCount="{Binding Count}"
Grid.Row="1">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock VerticalAlignment="Center"
Foreground="Blue"
Width="80">
<Run Text="Unit" />
<Run Text="{Binding Key, Mode=OneWay}" />
</TextBlock>
<ItemsControl ItemsSource="{Binding Value}"
VerticalAlignment="Center">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Value.Cost, StringFormat={}{0:C}}"
Margin="5"
Width="80" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
,然后你得到这个:
太棒了!要命!你认为我可以使用DataGridColumnHeader和DataGridRowHeader作为头文件吗? 我想我正在寻找一个继承Selector或MultiSelector的自定义控件,它应该有一个ColumnItemsSource,RowItemsSource和一个事件GeneratingCell,它的EventArgs提供了当前的单元格Item + Unit,并且我必须提供生成单元格的DataContext的属性,它会根据CellDataTemplate属性生成单元格。但由于我没有开发定制控件的严肃经验,所以我很难从头开始。 – Shimmy 2010-11-23 10:52:08