2013-09-01 11 views
12

Napisałem narzędzie, które generuje kwerendy sql przy użyciu graficznego interfejsu użytkownika, chcę przepisać narzędzie przy użyciu MVVM i WPF, każdy typ kolumny sql ma inną kontrolę, jak widać na poniższym obrazkuMVVM i dynamiczna generacja formantów

enter image description here

dodać kontrolę filtra kolumny na podstawie typu kolumny SQL i wygenerować kod za pomocą elementów sterujących, podobnie jak kiedyś zrobić w Windows Forms.

  1. w MVVM Czytałem, że widok jest writtien enteirly użyciu XAML, robi MVVM apartament taki wniosek, gdzie mam dodać inny użytkownik formantów dynamicznie do panelu stosu?
  2. Kontrolki nie będą istnieć w widoku, chyba że kolumna zostanie kliknięta podwójnie, co oznacza, że ​​formant nie będzie dostępny w Xaml i nie będzie ukryty ani zwinięty.
  3. Czy jest jakiś sposób na uniknięcie powiązań w kodzie?
  4. Czy powinienem utworzyć kontrolkę użytkownika dla każdego typu kolumny?
  5. ogólnie, jakie jest najlepsze podejście do tworzenia takich aplikacji ze złożonym i dynamicznym interfejsem użytkownika wykorzystującym mvvm?
+4

XAML nie jest MVVM. I WPF! = MVVM. WPF jest dobrym przyjacielem MVVM, a XAML jest tylko znacznikiem UI. Widok XAML nie jest tylko XAML - ma sklejoną klasę (tzw. Code-Behind), ale nie powinieneś używać jej do głównej logiki, używaj jej tak mniej, jak to tylko możliwe. Oczywiście można zaimplementować generowanie kontroli za pomocą kodu, ale jest to podejście ** ABSOLUTNIE NIE MVVM **. – oxfn

+3

@ user1590636 Twój wygenerowany GUI wygląda naprawdę ładnie i łatwo. – WiiMaxx

+2

Czy poprosiłeś dziewczynę o rękę? – Purusartha

Odpowiedz

13

Zgadnij, wiem, jak to osiągnąć, ale jest to bardzo skomplikowane. Najpierw powinieneś zrozumieć podstawowe pojęcia MVVM. Główny ViewModel powinien być klasą z ObservableCollection ViewModels, każdy z nich reprezentuje kolumnę z jej danymi i właściwościami.

interface IViewModel : INotifyPropertyChanged,IDisposable 
{ 
} 

interface IColumnViewModel : IViewModel 
{ 
} 

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

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

W widoku Przypuszczam coś podobnego ItemsControl z ItemTemplate, że należy osadzić ContentControl z DataTemplate, że zostanie automatycznie wybrany przez WPF według zbindowanych DataContext z elementu listy.Sam StackPanel nie nadaje się do tego, ale to może być powoływane jako 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> 

Więc trzeba budować View/ViewModel pair dla każdego typu kolumny.

Mam nadzieję, że mój przykład pomoże. Powodzenia ze swoją dziewczyną i MVVM :)

1

Cóż, twój widok nie jest napisany w całości w XAML - generujesz kontrolki w C#.

Nie sądzę, że zyskasz coś z przepisywania tego i dopasowania go do formy MVVM. Po prostu zachowaj kod taki jak teraz i ciesz się.

+6

problem jest moja dziewczyna nie wyjdzie za mnie, jeśli nie używam MVVM, gdybyś napisał coś takiego z MVVM, może dać mi ogólny pomysł, jak to zrobić? – user1590636

+1

Musisz również utworzyć powiązania w kodzie. – zmbq

+1

@zmbq on nie musi tworzyć wiązań w kodzie, po prostu musi użyć luki DataTemplates, która powinna być w stanie wyświetlić swoje rzeczy w sposób ogólny – WiiMaxx

3

Jeśli mam rozumieć swój scenariusz poprawnie: Można używać szablonów danych & przedmioty Szablony Na przykład napisałem aplikację, która ładuje dane do kolekcji, a następnie pokazuje każdy element tej kolekcji w panelu Wrap [Or panel stosu] na podstawie zdefiniowanego szablonu danych. i owinąć przedmioty Penel są zsynchronizowane przez samą odbioru w wiązaniu dwukierunkowy należy rozważyć użycie obserwowalnych Kolekcje, aby osiągnąć ten cel Następnie można wypełnić kolekcji i zobacz wyniki na widoku Mam nadzieję, że to pomoże

3

Aby napisać coś takiego w MVVM, miałbyś jeden widok, powiedzmy, twój obszar zawartości. Widok ten miałby model widoku, jedną z właściwości tego modelu widoku byłby widok lub kilka właściwości tego modelu widoku stanowiłoby widok. Czasami trzeba trochę owijać głowę, ale jeśli używasz funkcji Inversion of Control i Dependency Injection, widok widoków jest bardzo łatwy w zarządzaniu w MVVM.