2013-09-01 13 views
12

ho scritto uno strumento che genera query SQL utilizzando GUI, voglio riscrivere lo strumento utilizzando MVVM e WPF, ogni tipo di colonna sql ha un controllo diverso come puoi vedere nell'immagine seguenteMVVM e generazione dinamica di controlli

enter image description here

aggiungo un controllo filtro di colonna in base al tipo di colonna SQL e generare i comandi utilizzando il codice, come i utilizzata per fare in forme finestre.

  1. in MVVM ho letto che la vista è writtien enteirly utilizzando XAML, fa MVVM suite di tale applicazione in cui devo aggiungere diversi utenti controlli dinamicamente a un pannello pila?
  2. I controlli non saranno presenti nella vista a meno che non venga fatto doppio clic su una colonna, il che significa che il controllo non sarà disponibile in xaml e non verrà nascosto o collassato.
  3. esiste un modo per evitare i binding nel codice?
  4. devo creare un controllo utente per ogni tipo di colonna?
  5. in generale qual è l'approccio migliore per rendere tale applicazione con ui complessi e dinamici usando mvvm?
+4

XAML non è MVVM. E WPF! = MVVM. WPF è un buon amico di MVVM e XAML è solo un markup dell'interfaccia utente. XAML-view non è solo XAML - ha una classe incollata (chiamata Code-Behind), ma non dovresti usarla per la logica principale, usala il meno possibile. Ovviamente, è possibile implementare la generazione dei controlli in code-behind, ma questo è ** ASSOLUTAMENTE NON un approccio MVVM **. – oxfn

+3

@ user1590636 la tua GUI generata sembra davvero bella e semplice – WiiMaxx

+2

Hai fatto sposare la tua ragazza? – Purusartha

risposta

13

Indovina, so come raggiungerlo, ma è una cosa molto complessa. Per prima cosa dovresti comprendere i concetti di base MVVM. Main ViewModel dovrebbe essere una classe con ObservableCollection di ViewModels, ognuno di essi rappresenta una colonna con i suoi dati e proprietà.

interface IViewModel : INotifyPropertyChanged,IDisposable 
{ 
} 

interface IColumnViewModel : IViewModel 
{ 
} 

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

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

In vista suppongo qualcosa come ItemsControl con ItemTemplate, che dovrebbe incorporare ContentControl con DataTemplate, che devono essere selezionati automaticamente da WPF in base alla binded DataContext della voce di elenco.StackPanel sé non è adatto per questo, ma può essere invocata come 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> 

Quindi, si dovrebbe costruire coppia Vista/ViewModel per ogni tipo di colonna.

Spero che il mio esempio possa essere d'aiuto. Buona fortuna con la tua ragazza e MVVM :)

1

Bene, la visualizzazione non è interamente scritta in XAML: i controlli vengono generati in C#.

Non credo che otterrete qualcosa dalla riscrittura di questo e adattandolo a uno stampo MVVM. Basta tenere il codice com'è ora e divertiti.

+6

problema è che la mia ragazza non mi sposerà se non uso MVVM, se tu fossi tu a scrivere qualcosa del genere con MVVM, potresti darmi un'idea generale su come lo faresti? – user1590636

+1

Dovrai anche creare i bind nel codice. – zmbq

+1

@zmbq non ha bisogno di creare associazioni nel codice, deve solo usare un mazzo di DataTemplates che dovrebbe essere in grado di mostrare le sue cose in modo generico – WiiMaxx

3

Se ho capito la tua situazione in modo corretto: È possibile utilizzare i modelli di dati & Articoli modelli Per esempio ho scritto un programma che carica i dati in raccolta e poi mostra ogni elemento di quella raccolta in un pannello Wrap [Or pannello dello stack] in base al modello di dati definiti. e avvolgere oggetti Penel sono in sincronia con la raccolta stessa all'interno di legame a doppio senso Si dovrebbe considerare l'utilizzo di osservabili Collezioni per raggiungere questo obiettivo Poi si può riempire la collezione e vedere i risultati su una visione Spero che questo aiuta

3

Per scrivere qualcosa di simile in MVVM, avresti una vista che è la tua area di contenuto. Quella vista avrebbe un modello di vista, una delle proprietà di quel modello di vista sarebbe una vista, o diverse proprietà di quel modello di vista sarebbero una vista. A volte ci vuole un po 'di tempo per girare la testa, ma se si utilizza Inversion of Control e Dependency Injection correttamente, una vista delle viste è molto gestibile in un pattern MVVM.