WPF 二维 DataGrid/ListView?

标签 wpf listview datagrid pivot-table multidimensional-array

我有一个由 3 列组成的表 Item:

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 等作为行标题和列标题,并相应地生成/设置单元格。

最佳答案

首先,您需要将 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

关于WPF 二维 DataGrid/ListView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4251183/

相关文章:

c# - 从工具箱中的程序集隐藏所有 WPF 用户控件

c# - 我应该如何从 Task 更新 UI 线程?

java - 如何在将列表项添加到 ListView 之前以编程方式设置列表项中的字体大小?

android - 代码中如何/在何处检测 ListFragment ListView 中的所有项目是否可见?

wpf - 为什么我无法将 WPF Toolkit DataGrid ItemSsource 绑定(bind)到 DataTable?

javascript - Dojo datagrid - 尚未绘制的行的 getSelected()

wpf - 模型 View ViewModel + WPF-需要进一步了解

c# - WPF:复杂图像的快速绘制/缩放

Android:帮助设计人员经理

javascript - 使用JSONP使用WCF跨域存储在datagrid中并查看数据dojo?