2016-08-02 13 views
3

Wie fülle ich einen ListView aus einer Datenbank mit dem MVVM-Muster? Ich bevorzuge das EntityFramework, aber momentan mache ich das mit einem SQLAdapter, also wäre ich schon mit einer funktionierenden Lösung zufrieden.Wie fülle ich einen ListView aus einer Datenbank mit dem MVVM-Muster?

Ich habe eine Klassenbibliothek, die ich Modelle nenne. Diese libary enthält eine Klasse ProjectCompletedModel.vb

Public Class ProjectCompletedModel 

    ' Read this article if the Auto-Implemented Properties do not match your needs: 
    ' https://msdn.microsoft.com/de-de/library/dd293589.aspx 

    ''' <summary> 
    ''' Get or set the project number. 
    ''' </summary> 
    ''' <value>Set the project number</value> 
    ''' <returns>Get the project number</returns> 
    ''' <remarks></remarks> 
    Public Property ProjectNumber As String 

    ''' <summary> 
    ''' Get or set the project name. 
    ''' </summary> 
    ''' <value>Set the project name</value> 
    ''' <returns>Get the project name</returns> 
    ''' <remarks></remarks> 
    Public Property ProjectName As String 

    ''' <summary> 
    ''' Get or set the customer name. 
    ''' </summary> 
    ''' <value>Set the customer name</value> 
    ''' <returns>Get the customer name</returns> 
    ''' <remarks></remarks> 
    Public Property CustomerName As String 
End Class 

Next Ich habe eine Klasse libary Viewmodel genannt. Es enthält die Klasse ProjectCompletedViewModel.vb

Imports System.Collections.ObjectModel 

Public Class ProjectCompletedViewModel 

    Private projCompleted As New Models.ProjectCompletedModel 

    Public Property Projects As ObservableCollection(Of Models.ProjectCompletedModel) 

    Public Property ProjectNumber As String 
     Get 
      Return Me.projCompleted.ProjectNumber 
     End Get 
     Set(value As String) 
      Me.projCompleted.ProjectNumber = value 
     End Set 
    End Property 

    Public Property ProjectName As String 
     Get 
      Return Me.projCompleted.ProjectName 
     End Get 
     Set(value As String) 
      Me.projCompleted.ProjectName = value 
     End Set 
    End Property 

    Public Property CustomerName As String 
     Get 
      Return Me.projCompleted.CustomerName 
     End Get 
     Set(value As String) 
      Me.projCompleted.CustomerName = value 
     End Set 
    End Property 
End Class 

Der Code für meine Ansicht, die die Folowing ist:

<UserControl x:Class="ProjectCompletedView" 
      x:Name="WpfUserControl1" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:vm="clr-namespace:ViewModels;assembly=ViewModels" 
      mc:Ignorable="d" 
      d:designheight="400" d:designwidth="400" Background="#D7E4F2" d:DesignWidth="918" d:DesignHeight="478" 
      > 

    <UserControl.Resources> 
     <vm:ProjectCompletedViewModel x:Key="projComplObj"/> 
    </UserControl.Resources> 

    <UserControl.DataContext> 
     <vm:ProjectCompletedViewModel/> 
    </UserControl.DataContext> 

    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="1*"/> 
      <ColumnDefinition Width="2*"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="1*"/> 
      <RowDefinition Height="3*"/> 
     </Grid.RowDefinitions> 

     <ListView x:Name="lvProjects" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,52,0,0" Grid.RowSpan="2"> 

      <!-- Define the column names --> 
      <ListView.View> 
       <GridView> 
        <GridViewColumn Header="ProjectNumber" Width="100" DisplayMemberBinding="{Binding ProjectNumber}"/> 
        <GridViewColumn Header="ProjectName" Width="100" DisplayMemberBinding="{Binding ProjectName}"/> 
        <GridViewColumn Header="Customer" Width="100" DisplayMemberBinding="{Binding CustomerName}"/> 
       </GridView>     
      </ListView.View>    
     </ListView> 
    </Grid> 
</UserControl> 

Es führt zu folgendem Entwurf durch einige hart codierte Werte im Konstruktor der .xaml.vb Hinzufügen Datei.

Me.lvProjects.Items.Add(New ViewModels.ProjectCompletedViewModel() With {.ProjectNumber = "", 
                           .ProjectName = "Alpha", 
                           .CustomerName = "AlphaCustomer"}) 

GUI0

Ziel ist es, Gruppe Kunden oder jede Spalte, die ist, warum ich mit einem Listview arbeiten möchten. Es macht nichts mit der Gruppierung zu tun, für die ich bereits den Code habe. Meine erste Ausgabe ist das Laden der ListView aus der DataBase mit MVVM.

Meine Anwendung verweist auf ViewModels. ViewModels hat einen Verweis auf Models.

sieht wie folgt aus:

architecture0

Ich bin in der Lage, die Listview mit Codebehind zu füllen, indem eine Datentabelle erzeugen und die DataTable.DefaultView zum ListView.ItemSource zuweisen. Mit der Option "DisplayMemberBinding = {Binding TableName}" kann ich meine Daten sehr schnell und einfach anzeigen. Aber ich möchte es wiederverwendbar und wartbar halten. => MVVM.

Antwort

2

Sie hatte einen guten Start für MVVM. Eine Sache, die Sie verstehen sollten, ist das Konzept von DataContext und DataBinding für WPF.

Für Wiederverwertbarkeit, verwende ich häufig Databinding der Ansicht (Sie Ihr Ansichtsmodell zu Kontrollen binden könnten, aber ich ziehe ein Ansichtsmodell für die Ansicht für die Kontrollen enthalten Viewmodel verwenden ...)

In dem Code hinter der Ansicht, , Verwende ich den DataContext, um einen Kontext für meine Sicht zu geben. Das ViewModel enthält die ObservableCollections, die gebunden werden.

// C# 
base.DataContext = ViewModel; 
// VB.Net 
Me.DataContext = ViewModel; 

Ich denke, dass Sie bereits eine Bindung haben, da Sie

<UserControl.DataContext> 
    <vm:ProjectCompletedViewModel/> 
</UserControl.DataContext> 

Im Anschluss an diese View-Viewmodel-Bindung haben, kann ich eine Bindung an meine Listview geben!

<ListView ItemsSource="{Binding MyJokers}" 
    [...] /> 

MyJokers ist eigentlich der Name meines Eigentums in meinem Viewmodel (beachten Sie, dass die Eigenschaft muss öffentliche setted)

public ObservableCollection<JokerViewModel> MyJokers 
{ 
    get { return _myCollection; } 
    private set { _myCollection = value; } 
} 

Sie dann Ihre Listviewitem auf den öffentlichen Eigenschaften dieses Ansichtsmodelles binden können (da Die ListView enthält die untergeordneten ViewModel-Child-Elemente. Sie können Ihre ListViewItems mit ItemTemplate anpassen, wenn dies erforderlich ist.

Mit dieser Bindung können Sie Ihr ListView und ViewModel problemlos ändern.

+1

Mit Hilfe von diesem Kerl hier http://StackOverflow.com/Questions/14179967/Fill-ObservableCollection-Directly-from-SQL-Server Ihre Anweisungen haben mich dieses Problem zu lösen. Vielen Dank! Sie können es einfach in VB.NET anpassen. Ändern Sie einfach base.DataContext = ".." zu Me.DataContext = New ViewModel. –

+0

Danke, ich werde meine Antwort aktualisieren, um die Kontextbindung einzubinden. –

3

Sie müssen die Listview auf diese Weise eingestellt:

<ListView Grid.ColumnSpan="2" HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch" Margin="0,52,0,0" 
    Grid.RowSpan="2" ItemsSource="{Binding Projects}"> 

Die Itemssource-Eigenschaft des Listview müssen den öffentlichen Eigentum Projekte des Ansichtsmodell festgelegt werden. Jetzt können Sie aus dem Viewmodel die ObservableCollection (Of Models.ProjectCompletedModel) mit Ihren Daten füllen und füllen.

Sie können die Ressourcen entfernen:

<UserControl.Resources> 
    <vm:ProjectCompletedViewModel x:Key="projComplObj"/> 
</UserControl.Resources> 
+0

Vielen Dank für unsere schnelle Antwort. Ich werde daran arbeiten und Ihnen so bald wie möglich berichten. –

+0

Ich habe die UserControl.Resources entfernt und es hat meine Anwendung nicht durcheinander gebracht. Ich bin daran interessiert, warum ich es entfernen könnte, ohne etwas zu brechen. Vielen Dank. –

+3

Sie benötigten keine Ressource innerhalb des XAML, da Sie bereits einen Datenkontext in der Ansicht mit