2010-11-22 41 views
4

我有一个表Item,它由3米栏:WPF二维DataGrid/ListView?

ItemId int PK 
RoomId int FK 
UnitId int FK 
Cost money 

我希望有具有动态生成的列和行代表下列枢轴一个DataGrid/ListView中:

 Room1 Room2 Room3 Room4 
Unit1 $34 $72 $48 $98 
Unit2 $64 $56 $67 $24 
Unit3 $24 $34 $34 $34 

我更喜欢控制或助手到现有的一个,而不是一个肮脏的功能,因为我会需要这个场景很多,但任何东西都热烈欢迎。

我想要有Room1Unit1等行和列标题,并相应地生成/设置单元格。

回答

8

首先,你需要你的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> 

,然后你得到这个:

alt text

+0

太棒了!要命!你认为我可以使用DataGridColumnHeader和DataGridRowHeader作为头文件吗? 我想我正在寻找一个继承Selector或MultiSelector的自定义控件,它应该有一个ColumnItemsSource,RowItemsSource和一个事件GeneratingCell,它的EventArgs提供了当前的单元格Item + Unit,并且我必须提供生成单元格的DataContext的属性,它会根据CellDataTemplate属性生成单元格。但由于我没有开发定制控件的严肃经验,所以我很难从头开始。 – Shimmy 2010-11-23 10:52:08