WPF二维DataGrid / ListView? [英] WPF Two-dimensional DataGrid/ListView?

查看:183
本文介绍了WPF二维DataGrid / ListView?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a table Item that consists of 3 columns:

ItemId int PK
RoomId int FK
UnitId int FK
Cost money



我想要一个DataGrid / ListView具有动态生成的列和行代表以下枢轴:

I want to have a DataGrid/ListView having dynamically-generated columns and rows representing the following pivot:

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

我喜欢现有的控件或帮助器,而不是脏功能,因为我需要这个场景很多,但任何东西都是热烈欢迎的。

I prefer a control or a helper to an existing one rather than a dirty function since I am gonna need this scenario a lot, but anything at all is warmly welcommed.

我想要将 Room1 Unit1 等作为行和列标题,以及

I want to have the Room1 and the Unit1 etc. as row and column headers, and the cells generated/set accordingly.

推荐答案

首先,您需要转换您的项目的集合对象转换成合适的集合:

Firstly, you'd need to convert your collection of Item objects into a suitable collection:

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);

然后您需要一个 ItemsControl 正确的 DataTemplate 配置

and then you need an ItemsControl with the correct DataTemplate configuration

<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>

然后你得到这个:

这篇关于WPF二维DataGrid / ListView?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆