2010-09-22 2 views
0

Bon, voici la situation. Net 4 WPF NO Silverlight.MVVM et DataGrid View réutilisation en tant que contrôles intégrés dans d'autres vues avec des données de sous-ensembles

J'ai plusieurs vues qui présentent une grille de données montrant le contenu de certaines collections observables, par ex.

ObservableCollection<ClassAViewModel> sourceA; 
ObservableCollection<ClassBViewModel> sourceB; 
ObservableCollection<ClassCViewModel> sourceC; 

Les collections sont remplies par un appel à la couche d'accès aux données. Je peux afficher ces données assez facilement avec un Usercontrol qui contient une grille de données liée à la collection appropriée. je

  • ClassAView et ClassAViewModel à affichage commande de simples ClassA données,
  • ClassBView et ClassBViewModel à affichage commande de simples ClassB données
  • ClassCView et ClassCViewModel à écran de contrôle de simple ClassC données

J'ai aussi:

  • AllClassAView et AllClassAViewModel pour afficher une grille de données avec les données relatives à toutes les instances ClassA.
  • AllClassBView et AllClassBViewModel pour afficher une grille de données avec les données relatives à toutes les instances ClassB.

    etc.

disent maintenant que ClassA contient un sous-ensemble de la collection ClassB et un sous-ensemble de la collection ClassC etc.

Dans mon fichier de ressources que je les ai châtiés ViewModels et leurs vues ensemble de la manière suivante (vm et vw sont les espaces de noms où ils se trouvent):

<DataTemplate DataType="x:Type vm:ClassAViewModel}"> 
    <vw:ClassAView/> 
</DataTemplate> 

Maintenant w Je souhaitais faire était d'utiliser un AllClassBView ou AllClassBViewModel dans le ClassAView pour afficher le sous-ensemble de ClassB instances qui se rapportent à elle.

Quelle est la meilleure façon d'appeler ces données? Puis-je réutiliser le UserControl AllClassBView pour afficher un sous-ensemble du ClassB ObservableCollection et quelle est la meilleure façon de procéder?

Je ne veux pas placer un code dans le fichier ClassAView.cs que dans le ClassAView.xaml ou ClassAViewModel.

Dois-je simplement ajouter une nouvelle propriété à AllClassBView et l'utiliser pour filtrer la liste?Par exemple dans les ClassBViewModel où je produis la liste des ClassBViewModels (pour une utilisation dans le DataGrid) Je peux utiliser:

if(this.ClassA_Id!=0) 
{ 
    List<ClassBViewModel> all = (from ClassB in this.DataRepository.GetClassBs().Where(x=>x.ClassA_Id == this.ClassA_Id) select new ClassBViewModel()).ToList(); 
} 
else 
{ 
    List<ClassBViewModel> all = (from ClassB in this.DataRepository.GetClassBs() select new ClassBViewModel()).ToList(); 
} 

this.sourceB= new ObservableCollection<ClassBViewModel>(all); 

Répondre

0

Eh bien, j'ai craqué.

Mon problème n'a peut-être pas été très clair. Que ma solution soit bonne ou non, je ne sais pas.

Ce que je l'ai fait est la suivante:

J'ai placé une propriété supplémentaire dans la AllClassBViewModel qui me permet de filtrer la liste des ClassBViewModels à ceux qui se rapportent à ClassA.

public ulong ClassA_Id{get;set;} 

Alors maintenant, quand le AllClassBViewModel construit sa liste de ClassBViewModels il peut maintenant les filtrer par:

if(this.ClassA_Id!=0) 
{ 
    List<ClassBViewModel> all = (from ClassB in this.DataRepository.GetClassBs().Where(x=>x.ClassA_Id == this.ClassA_Id) select new ClassBViewModel()).ToList(); 
} 
else 
{ 
    List<ClassBViewModel> all = (from ClassB in this.DataRepository.GetClassBs() select new ClassBViewModel()).ToList(); 
} 

this.sourceB= new ObservableCollection<ClassBViewModel>(all); 

J'ai ajouté une propriété et sur le terrain à mon ClassAViewModel qui étaient du type AllClassBViewModel.

private AllClassBViewModel fieldAllClassBViewModel; 
public AllClassBViewModel AllClassBVM{get{return this.fieldAllClassBViewModel;}} 

J'ai ensuite ajouté une entrée à un AllClassBView dans le ClassAView qui avait un contexte de données lié à la propriété AllClassBVM au sein ClassAViewModel.

<vw:AllClassBView DataContext="{Binding AllClassBVM}"/> 

Pas tout ce que je dois faire est de vérifier par la commande obligatoire.

Questions connexes