WPF Two-dimensional DataGrid/ListView?

前端 未结 1 842
野性不改
野性不改 2020-12-06 08:26

I have a table Item that consists of 3 columns:

ItemId int PK
RoomId int FK
UnitId int FK
Cost money

I want to have a DataGri

相关标签:
1条回答
  • 2020-12-06 08:44

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

    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>
    

    and then you get this:

    alt text

    0 讨论(0)
提交回复
热议问题