4 Stimmen

WPF Zweidimensionales DataGrid/ListView?

Ich habe eine Tabelle Item die aus 3 Spalten besteht:

ItemId int PK
RoomId int FK
UnitId int FK
Cost money

Ich möchte ein DataGrid/ListView mit dynamisch generierten Spalten und Zeilen haben, die den folgenden Drehpunkt darstellen:

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

Ich bevorzuge ein Steuerelement oder einen Helfer für ein bestehendes Steuerelement anstelle einer unsauberen Funktion, da ich dieses Szenario häufig benötigen werde, aber alles ist herzlich willkommen.

Ich möchte die Room1 y el Unit1 usw. als Zeilen- und Spaltenüberschriften, und die Zellen werden entsprechend erzeugt/eingestellt.

8voto

Dean Chalk Punkte 19313

Erstens müssen Sie Ihre Sammlung von Item Objekte in eine geeignete Sammlung:

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

und dann brauchen Sie eine ItemsControl mit dem richtigen DataTemplate Konfiguration

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

und dann bekommen Sie das hier:

alt text

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X