2016-04-27 5 views
0

Grundsätzlich muss ich zwei ObservableCollections, wie zum Beispiel eine Product und BrandInfo verbinden, wo das Modell eine inoffiziell definierte foreign key zu BrandInfo hat. Diese Modelle verwenden Sqlite-Net für Datenpersistenz.Wie kann man zwei Tabellen in GridView erstellen?

Ich möchte die Kombination der beiden in einer GridView anzeigen, die die Grundlage für zukünftige Datenbearbeitung auf anderen Xaml Bildschirme sein wird.

Meine aktuelle Einrichtung hat Daten durch eine viewModel Klasse gebunden, die Daten über das Product Modell erwerben. Die viewModel hat eine ObservableCollection Instanz von Product und funktioniert ordnungsgemäß.

Von dem, was ich lese, kann ich brauche CompositeCollection zu verwenden oder möglicherweise ein Modell erstellen, das die join von Product und BrandInfo darstellt. Betrachtet man Sqlite-Net nicht unterstützt Fremdschlüssel wie Entity Framework und andere ORM's tun, bin ich nicht wirklich sicher, wie man mit CompositeCollection gehen. Ich bin mir auch nicht sicher, ob es eine gute Idee ist, eine nicht in der Datenbank gespeicherte Kombination der beiden Modelle zu machen. Irgendein Rat oder Schnipsel kann einen langen Weg bringen, um mir zu helfen!

Vielen Dank im Voraus!

Einige Code:

MainWindowViewModel.cs

using GalaSoft.MvvmLight; 
using GalaSoft.MvvmLight.Command; 
using StoreFront.Models; 
using StoreFront.Services; 
using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 


namespace StoreFront.ViewModels { 
    public class MainWindowViewModel : ViewModelBase,IMainViewModel { 

     private IDataService dataService; 

     IDialogService dialogService; 
     IStorageService storageService; 

     public MainViewModel(IDataService dataService, IStorageService storageService) { 
      this.dataService = dataService; 
      this.storageService = storageService; 

      RefreshAsync(); //Basically fills the product ObservableCollection with data. 
     } 

     private ObservableCollection<Product> product = new ObservableCollection<Product>(); 
     public ObservableCollection<Product> Product { 
      get { 
       return product; 
      } 
     } 

} 

Product.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using SQLite; 

namespace StoreFront.Models { 
    public class Product { 

     [PrimaryKey, AutoIncrement] 
     public int Id { get; set;} 

     public string ItemName { get; set;} 

     public double Price { get; set;} 

     public int BrandInfoFK { get; set;}  
    } 
} 

BrandInfo.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using SQLite; 

namespace StoreFront.Models { 
    public class BrandInfo { 

     [PrimaryKey, AutoIncrement] 
     public int Id { get; set;} 

     public string BrandName { get; set;} 

     public string Description { get; set;} 
    } 
} 

Antwort

1

EDIT erste Antwort, die ich hatte, basierte vollständig auf einer Fehlinterpretation der Frage.

Da ich SQLite nicht kenne, bin ich mir nicht sicher, ob Ihre Produkt- und BrandInfo-Modelle durch Codegenerierung erstellt oder manuell erstellt werden. Würden Sie die BrandInfo-Eigenschaften zu Product hinzufügen können, wenn sie manuell erstellt werden? Wenn möglich, können Sie Linq verwenden, um Ihre Sammlung von Produkt- und brandinfo Modelle zu verbinden, um eine Sammlung zu erstellen, die Sie in Ihrem Gridview binden können:

void Main() 
{ 
    List<Product> products = new List<Product>() { new Product() {Id = 1, ItemName="Item1", BrandInfoFK=1}, new Product() {Id=2, ItemName="Item2", BrandInfoFK=2}}; 
    List<BrandInfo> brands = new List<BrandInfo>() { new BrandInfo() { Id = 1, BrandName="One"}, new BrandInfo() {Id = 2, BrandName="Two"}}; 


    List<Product> joinedProducts = products.Join(brands, p => p.BrandInfoFK, b => b.Id, (p, b) => new Product() 
    { 
     Id = p.Id, 
     ItemName = p.ItemName, 
     Price = p.Price, 
     BrandInfoFK = p.BrandInfoFK, 
     BrandName = b.BrandName, 
     BrandDescription = b.Description 
    }).ToList(); 
} 


public class Product { 

    public int Id { get; set;} 

    public string ItemName { get; set;} 

    public double Price { get; set;} 

    public int BrandInfoFK { get; set;}  

    // Brand properties 
    public string BrandName {get; set;} 

    public string BrandDescription {get; set;} 
} 

public class BrandInfo { 
    public int Id { get; set;} 

    public string BrandName { get; set;} 

    public string Description { get; set;} 
} 

Ich verwende Liste ist hier, aber Sie können ObservableCollection die leicht anpassen. Wenn Sie die BrandInfo-Eigenschaften nicht zu Ihrem Produktmodell hinzufügen können/möchten, können Sie vielleicht auch eine von Product abgeleitete Klasse erstellen, die diese Eigenschaften hinzufügt.

+0

Die Art, wie ich sehe, dass viewModels verwendet werden, bezieht sich auf die Benutzeroberfläche, nicht unbedingt auf die Modelle. Was ich meine, ist, dass es in der Regel ein 1 zu 1 Verhältnis mit Ihrer UI und ViewModels gibt (d. H. 'MainWindowViewModel' und' DetailsViewModel' mit 'MainWindow.xaml' und' DetailsWindow.xaml'). Dieser Leckerbissen von Informationen hat Laurent, der Schöpfer von MVVM-Light, in seinen PluralSight-Vorträgen gesagt. Das gesagt, ich bin für alles bereit, wenn es ein Beispiel gibt, das ich sehen konnte. Ich werde versuchen, einen Code als Referenz hinzuzufügen. Ich entschuldige mich dafür, dass ich das nicht früher getan habe. –

+0

@Steven_BDawg Ich stimme nicht mit allem überein, was du gesagt hast :).Jetzt, da Sie Ihren Code eingegeben haben, habe ich Ihre Frage in Bezug auf das, was Sie darstellen wollten, falsch verstanden, als Sie sagten, Sie wollten eine Kombination der Elemente anzeigen. Möchten Sie grundsätzlich ein Raster mit einem Produkt pro Zeile anzeigen, dessen Spalten "Artikelname", "Preis", "Markenname" und "Beschreibung" repräsentieren? Mit anderen Worten, wollten Sie INNER JOIN die Tabellen und setzen Sie es in das Raster? – Rowbear

+0

Ja innerer Join mit mit den Abfrageergebnisdaten bindefähig! : D –

Verwandte Themen