2013-09-01 10 views
12

Ich habe ein Tool geschrieben, das SQL-Abfragen mit GUI generiert, ich möchte das Tool mit MVVM und WPF neu schreiben, jeder SQL-Spaltentyp hat ein anderes Steuerelement, wie Sie in der folgenden Abbildung sehen könnenMVVM und dynamische Generierung von Steuerelementen

enter image description here

i hinzufügen, einen Spaltensteuerfilter basierend auf dem SQL-Spaltentyp und i erzeugen die Steuerelemente Code verwendet, wie i verwendet in Fenstern Formen zu tun.

  1. in MVVM Ich habe gelesen, dass die Ansicht enteirly XAML writtien ist, macht MVVM Suite eine solche Anwendung, wo ich verschiedene Benutzer Steuerelemente dynamisch zu einem Stapel Panel hinzufügen müssen?
  2. Die Steuerelemente sind in der Ansicht nicht vorhanden, es sei denn, auf eine Spalte wird doppelt geklickt. Das bedeutet, dass das Steuerelement in der XAML nicht verfügbar ist und nicht ausgeblendet oder ausgeblendet wird.
  3. Gibt es eine Möglichkeit, dass ich die Bindungen im Code hinterher vermeiden kann?
  4. sollte ich ein Benutzersteuerelement für jeden Spaltentyp erstellen?
  5. im Allgemeinen, was ist der beste Ansatz, um solche Anwendungen mit komplexen und dynamischen ui mit MVVM zu entwickeln?
+4

XAML ist nicht MVVM. Und WPF! = MVVM. WPF ist ein guter Freund von MVVM und ein XAML ist nur ein UI-Markup. XAML-View ist nicht nur XAML - es hat eine geklebte Klasse (so genannte Code-Behind), aber Sie sollten es nicht für die Hauptlogik verwenden, verwenden Sie es so wenig wie möglich. Natürlich können Sie die Generierung von Steuerelementen in Code-Behind implementieren, aber dies ist ** ABSOLUT NICHT ein MVVM ** -Ansatz. – oxfn

+3

@ user1590636 Ihre generierte GUI sieht wirklich nett und einfach aus – WiiMaxx

+2

Haben Sie Ihre Freundin dazu gebracht, Sie zu heiraten? – Purusartha

Antwort

13

Ich denke, ich weiß, wie man das erreicht, aber es ist sehr komplexe Sachen. Zuerst sollten Sie MVVM Grundkonzepte verstehen. Main ViewModel sollte eine Klasse mit ObservableCollection von ViewModels sein, von denen jede eine Spalte mit ihren Daten und Eigenschaften darstellt.

interface IViewModel : INotifyPropertyChanged,IDisposable 
{ 
} 

interface IColumnViewModel : IViewModel 
{ 
} 

class ViewModelBase : IViewModel 
{ 
    // ... MVVM basics, PropertyChanged etc. ... 
} 

class MainViewModel : ViewModelBase 
{ 
    ObservableCollection<IColumnViewModel> Columns {get; set} 
} 

In View nehme ich an so etwas wie ItemsControl mit ItemTemplate, die ContentControl mit DataTemplate einbetten soll, die von WPF nach binded DataContext der Listenposition automatisch ausgewählt werden soll.StackPanel selbst ist dafür nicht geeignet, aber es kann als ItemsPanelTemplate

<Window 
    xmlns:v="clr-namespace:WpfApplication.Views" 
    xmlns:vm="clr-namespace:WpfApplication.ViewModels"> 
    <Window.Resources> 
     <DataTemplate DataType="{x:Type TypeName=vm:TextColumnViewModel}"> 
      <v:TextColumnView/> 
     </DataTemplate> 
    </Window.Resources> 
    <ItemsControl 
     ItemsSource="{Binding Columns}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <ContentControl Content="{Binding}"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Window> 

So aufgerufen werden, sollten Sie Ansicht/Ansichtsmodell Paar für jede Spalte Typ bauen.

Hoffe, mein Beispiel wird helfen. Viel Glück mit Ihrer Freundin und MVVM :)

1

Nun, Ihre Sicht ist nicht vollständig in XAML geschrieben - Sie generieren Steuerelemente in C#.

Ich glaube nicht, dass Sie etwas davon bekommen, dies neu zu schreiben und es in eine MVVM-Form einzupassen. Behalte einfach den Code wie er jetzt ist und genieße.

+6

Problem ist meine Freundin wird mich nicht heiraten, wenn ich MVVM nicht verwende, wenn Sie Sie waren, etwas so mit MVVM zu schreiben, konnte mir eine allgemeine Idee geben, wie Sie es tun würden? – user1590636

+1

Sie müssen die Bindungen auch im Code erstellen. – zmbq

+1

@zmbq er muss keine bindungen im code erstellen, er muss nur ein paar datenTemplates verwenden, die in der Lage sein sollten, seine sachen auf generische weise anzuzeigen – WiiMaxx

3

Wenn ich Ihr Szenario richtig verstanden habe: Sie Datenvorlagen & Artikel können Vorlagen Zum Beispiel habe ich eine Anwendung geschrieben haben, die Daten in Sammlung lädt und dann zeigt jedes Element dieser Sammlung in einem Wrap-Panel [Or Stack Panel] basierend auf definierten Datenvorlagen. Und Wrap penel Artikel sind synchron durch die Sammlung selbst innerhalb von zwei Art und Weise Bindung Sie sollten dieses Ziel erreichen Dann können Sie die Sammlung füllen mit beobachtbaren Kollektionen betrachten und die Ergebnisse auf einem Blick Ich sehe hoffen, dass diese

3

hilft Um so etwas in MVVM zu schreiben, hätten Sie eine Ansicht, die Ihren Inhaltsbereich angibt. Diese Ansicht würde ein Ansichtsmodell haben, eine der Eigenschaften dieses Ansichtsmodells wäre eine Ansicht, oder mehrere Eigenschaften dieses Ansichtsmodells wären eine Ansicht. Es dauert ein wenig, bis man sich manchmal um den Kopf wickelt, aber wenn man Inversion von Control und Dependency Injection richtig benutzt, ist eine Ansicht von Views in einem MVVM-Pattern sehr überschaubar.

Verwandte Themen