2010-05-06 11 views
0

Alors comment afficher complexes ViewModels agrégés dont les modèles ont des relations les uns avec les autres?MVVM - plusieurs espaces de travail dans un espace de travail ne semble pas avoir de sens

NO disciple de WPF n'a jamais parlé à ce sujet, devinez pourquoi il est pas possible ...

Pensez-vous que des thats vrai?

Ne me comprenez pas?

Rechercher: Un CustomerViewModel a beaucoup OrderViewModel et ceux de nombreux ProductViewModel.

Vous avez 3 Workspaces pour entrer les nouvelles données pour tous 3 ViewModels ET vous avez 3 listboxes/combobo/DataGrid à MultiSelect Collections de type => customerVM s, orderVM s et productVM`s. Que l'interface utilisateur ait un sens pour l'utilisateur, il ne devrait pas avoir besoin d'éteindre/sur l'espace de travail chaque nouveau client/commande/produit est ajouté ce qui est une mauvaise expérience utilisateur, comment faites-vous cette exigence typique d'application métier?

EDIT:

Vous avez dans MVVM une collection de type WorkSpace. Chaque ViewModel peut être un Workspace car il dérive de la classe WorkSpace. La collection Workspaces est liée à un exemple ItemsSource afair josh smith.

Déclaration: Je veux utiliser les fenêtres goold matures forme des interfaces utilisateur aucun ViewModels refermables ... Problème: MVVM ne peut fonctionner avec des espaces de travail (la matière refermable ne marche pas ...) parce qu'un CustomerviewModel doit déjà être instancié puis ajouté à la collection workspaces liée à itemsControl et datatemplated en fonction du type de données.

Si je n'avais pas d'espaces de travail qui contiennent mes instances ViewModel, je ne pouvais pas les datatemplate car un ViewModel dans MVVM prend un modèle comme paramètre constructeur. DataTemplating un contrôle UserControl avec DataType du CustomerViewModel lèvera une exception dans XAML!

Maintenant, regardez mon interface utilisateur que je veux avoir: Je n'ai pas d'espaces de travail, mais 3 ViewModels = 3 UserControls moyens datatemplated 3 fois un big bang ...

Vous obtenez maintenant pourquoi je n'aime pas MVVM? Ce n'est pas bien pensé et je cherche une solution ...

Bien sûr, je pourrais mettre mes ViewModels alias DataFormulars dans un ObservableCollection mais je ne veux pas qu'ils soient liés à un ItemsControl. Je veux que ces 3 UserControl aient une certaine position dans ma mise en page. Avec ItemsControl vous avez une file d'attente stupide où un nouveau Dataformular est juste ajouté et emballé s'il ne rentre pas dans l'espace existant. C'est tout le design de disposition des déchets/mauvaise interface utilisateur.

Vous me ramenez vous maintenant?

Répondre

2

Vous pouvez facilement avoir plusieurs contrôles dans une fenêtre, chacun lié à un ViewModel différent.Pour coordonner entre les machines virtuelles, une approche typique consiste à coupler librement les différents composants ensemble en utilisant le passage de message. Par exemple, votre client ViewModel peut envoyer un message indiquant que vous avez sélectionné une commande, puis votre OrderViewModel (visualisé comme un contrôle dans une partie de votre fenêtre principale, peut-être) verra le message et changera l'ordre affiché.

Vous pouvez accomplir quelque chose de similaire avec une classe de service partagé qui expose une interface que vous injectez dans chacune de vos machines virtuelles. Vous pouvez ensuite lier les propriétés de cette interface partagée pour permettre aux machines virtuelles de communiquer, de la même manière que pour les messages. J'ai utilisé quelque chose de similaire pour représenter un concept "SelectedObject", où un large éventail de types d'objets différents pourrait être sélectionné et différentes machines virtuelles dans mon application ont différentes façons de visualiser cela. Par exemple, en utilisant votre exemple, si un produit est devenu SelectedObject, vous pourriez avoir un panneau «detail» qui rend maintenant le produit en utilisant un ProductDataTemplate standard et peut-être qu'un autre panneau (affichant l'Order) changerait SelectedItem sur une liste de produits. Vous pouvez facilement avoir plusieurs «espaces de travail» et tous restent synchronisés entre eux en vertu de l'ensemble des propriétés ou des messages que les machines virtuelles utilisent pour collaborer.

+0

Bien sûr, une fenêtre peut avoir plusieurs commandes avec datatype du viewmodel. Ce n'est pas de ça que je parle. Mon maître-détail avec produit/client/ordre - -ViewModelcollection fonctionne très bien sans la solution de contournement en utilisant un système de messagerie. Utilisez simplement IsSynchronizedTocurrentItem sur vos collections de machines virtuelles et reliez-les à tous les commutateurs. plus sur la modification voir ci-dessus. – msfanboy

+0

vous savez quoi, je suppose que j'avais en partie tort. Aujourd'hui j'ai vérifié Chinch qui est le cadre mvvm de Sacha Barber et il a soudainement ouvert mes yeux. Il n'utilise pas de constructeur dans son CustomerViewModel. Je sais pourquoi ;-) Il charge les commandes et les produits liés LAZILY. Je le fais EAGERLY lié à ma liste déroulante avec lié à AllCustomersViewModel. Le problème est dans le chargement paresseux/impatient des données connexes. Votre droit Dan si j'utilise le chargement différé Je renvoie le CustomerViewModel sélectionné à un autre endroit via Messenger pour afficher les OrderViewModels liés dans un DataGrid par exemple. – msfanboy

+0

Je vois le premier paragraphe que vous avez écrit comme une solution parce que vous avez conseillé ce que j'ai vu dans Chinch et il semble que je change ma stratégie de chargement afin que je puisse kicker le constructeur ViewMOdels, hurrraaayy XD – msfanboy