2016-08-03 14 views
0

ich einige Daten aus mehreren Datenbanken abfragen aufzulisten und sie in einem zweidimensionalen String Array wie folgt speichern:Bind zweidimensionalen String-Array Ansicht in WPF

string[databaseID,fieldID] 

... wo fieldID = 0 steht der Name des Feldes

Die Anzahl der Datenbanken variiert und kann zwischen mindestens einer und einer undefinierten Zahl liegen. Die Anzahl der Felder ist festgelegt.

Ich möchte eine Spalte für die Feldnamen und eine Spalte für jede Datenbank-ID haben. Jede Zeile sollte die Daten eines bestimmten Feldes jeder Datenbank enthalten. Es sollte beispielsweise wie folgt aussehen:

FieldName | Database1 | Database2 | Database3 
----------|-----------|-----------|----------- 
Name1  |  A  |  B  |  A 
----------|-----------|-----------|----------- 
Name2  |  1  |  2  |  3 

Wie kann ich das tun?

Für die Spaltenüberschriften erstellen, ich dies bereits haben:

GridView gridView = new GridView(); 
gridView.AllowsColumnReorder = true; 

GridViewColumn gvc1 = new GridViewColumn(); 
gvc1.DisplayMemberBinding = new Binding(""); 
gvc1.Header = "Feldname"; 
gvc1.Width = 100; 
gridView.Columns.Add(gvc1); 
for (int i = 0; i < databases.Count; i++) 
{ 
    GridViewColumn gvc = new GridViewColumn(); 
    gvc.DisplayMemberBinding = new Binding("Path=Row[" + (i + 1) + "]"); //Still not sure, wether this is okay 
    gvc.Header = databases[i].DisplayName; 
    gvc.Width = 100; 
    gridView.Columns.Add(gvc); 
} 
lvBasic.View = gridView; 

Der XAML Teil I siehe ist ziemlich einfach:

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"> 
    <ListView Name="lvBasic"> 
    </ListView> 
</ScrollViewer> 

UPDATE: Ich dachte, es würde keine Rolle, Also habe ich einen Aspekt meines Problems ausgelassen. Ich muss die Daten von Datenbank1 mit allen anderen Datenbanken vergleichen und benötige daher dieses Layout oder ein anderes Layout, das für diese Aufgabe geeignet ist.

+1

Wäre es nicht viel einfacher, ein neues Objekt mit den Array-Daten zu erstellen und einfach zu gruppieren? Das könnte die Lesbarkeit auch verbessern – lokusking

+0

Was meinst du damit? –

+0

Das Ding, nach dem Sie suchen, ist ein 'PivotGrid'. Leider ist dies nicht eingebaut, aber es gibt viele Unternehmen, die solche Möglichkeiten in ihren Frameworks anbieten (Telerik, Infragistics, DevExpress, etc). Unnötig zu sagen, dass du sie nicht kostenlos bekommst :( – lokusking

Antwort

1

Dies ist ein Ansatz, um meinen Kommentar zu erklären.

XAML

<Grid > 
     <Grid.Resources> 
      <CollectionViewSource Source="{Binding DataObjects}" x:Key="CollectionViewSource" > 
       <CollectionViewSource.GroupDescriptions> 
        <PropertyGroupDescription PropertyName="DatabaseId"/> 
       </CollectionViewSource.GroupDescriptions> 
      </CollectionViewSource> 
     </Grid.Resources> 
     <ListView ItemsSource="{Binding Source={StaticResource CollectionViewSource}}"> 
      <ListView.GroupStyle> 
       <GroupStyle> 
        <GroupStyle.ContainerStyle> 
         <Style TargetType="{x:Type GroupItem}"> 
          <Setter Property="Template"> 
           <Setter.Value> 
            <ControlTemplate> 
             <Expander IsExpanded="True"> 
              <Expander.Header> 
               <StackPanel Orientation="Horizontal"> 
                <TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="Gray" FontSize="22" VerticalAlignment="Bottom" /> 
                <TextBlock Text="{Binding ItemCount}" FontSize="22" Foreground="Green" FontWeight="Bold" FontStyle="Italic" Margin="10,0,0,0" VerticalAlignment="Bottom" /> 
                <TextBlock Text=" item(s)" FontSize="22" Foreground="Silver" FontStyle="Italic" VerticalAlignment="Bottom" /> 
               </StackPanel> 
              </Expander.Header> 
              <ItemsPresenter /> 
             </Expander> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
         </Style> 
        </GroupStyle.ContainerStyle> 
       </GroupStyle> 

      </ListView.GroupStyle> 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding FieldId}"/> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView>   
    </Grid> 

Datenobjekt

public class DataObject { 

    public string DatabaseId { get; set; } 

    public string FieldId { 
     get; set; 
    } 

    } 

Usage

this.DataObjects = new List<DataObject>(); 
     this.DataObjects.Add(new DataObject {DatabaseId = "Db1", FieldId = "FieldName"}); 
     this.DataObjects.Add(new DataObject { DatabaseId = "Db1", FieldId = "FieldFirstName" }); 
     this.DataObjects.Add(new DataObject { DatabaseId = "Db2", FieldId = "FieldName" }); 
     this.DataObjects.Add(new DataObject { DatabaseId = "Db2", FieldId = "FieldDate" }); 

     this.DataObjects.Add(new DataObject { DatabaseId = "Db3", FieldId = "FieldName" }); 
     this.DataObjects.Add(new DataObject { DatabaseId = "Db3", FieldId = "FieldDate" }); 
     this.DataObjects.Add(new DataObject { DatabaseId = "Db3", FieldId = "FieldFirstName" }); 
     this.DataObjects.Add(new DataObject { DatabaseId = "Db3", FieldId = "FieldId" }); 

Ergebnis resultImage

Dies ist eine 100% MVVM-Conform-Lösung. Sie können einfach durch Ihre Datenbank gruppieren und erweitern (oder umgekehrt die Logik, wenn das Ihren Bedürfnissen besser entspricht). Bitte beachten Sie, dass mein DataObject nichts mit Ihrer tatsächlichen Datenstruktur zu tun hat. Ich habe das in ungefähr 7 Minuten gemacht und es sollte dir eine alternative Sicht geben.

Prost

+0

Das ist eigentlich nicht schlecht. Das Problem ist, dass ich einen Aspekt in meiner Erklärung weggelassen habe, um es zu vereinfachen. Ich möchte einige Daten einer bestimmten Datenbank mit allen anderen Datenbanken vergleichen. Daher möchte ich es in dieser Spaltenansicht haben. Database1 ist eine Art Master-Datenbank, mit der ich alle Daten vergleichen möchte. –