2009-09-11 9 views
4

Je suis toujours en train d'essayer de comprendre MVVM. Disons que j'ai un modèle qui ressemble à ceci:WPF: MVVM et édition de données hiérarchiques

public class Company 
{ 
    public IList<Division> Divisions { get;set;} 
} 

public class Division 
{ 
    public string Name { get;set;} 
    public IList<Department> Departments { get;set} 
} 

public class Department 
{ 
    public string UnitNumber { get;set;} 
    public string DepartmentName { get;set;} 
    public IList<Employee> Employees { get;set;} 
} 

public class Employee 
{ 
    public string FirstName { get;set;} 
    public string LastName { get;set;} 
    public string JobTitle { get;set;} 
} 

Maintenant, disons que je veux afficher la hiérarchie de l'entreprise dans une grille hiérarchique, je crée une classe CompanyViewModel ci-dessous:

public class CompanyViewModel : INotifyPropertyChanged 
{ 
    private Company _company; 
    public Company Company 
    { 
     get { return _company;} 
     set { _company = value; NotifyPropertyChanged("Company");} 
    } 
} 

maintenant sur mon point de vue (WPF), je définirais le contexte de données au ViewModel et le DataGrid de choix se lierait au chemin "Company". Tout est grand à ce jour .... Je reçois une belle expansion/interface effondrement en Divions, départements, employés ...

sauf:

  1. si la grille est modifiable ... Les noms doivent Département être en mesure d'être changé (et validé par le ViewModel, même pour les noms d'employés ..

  2. Et si je veux ajouter de nouveaux employés, départements, etc. tout cela devrait être reflété dans la grille sans reconsolidation (c'est le point de liaison de données WPF n'est-ce pas?)

Solution possible:

Vous avez une classe ViewModel distincte pour chaque classe de domaine ...

Cela semble impliquer beaucoup de cartographie de DTO -> ViewModel, la duplication (parce qu'ils sont presque les mêmes objets et pas encore exactement.) Étant donné que je suis probablement déjà mappage à partir d'une entité ORM -> DTO sur le côté service, en l'envoyant sur le fil (WCF) au client, mappage chaque hiérarchie DTO dans son propre ViewModel est un processus lourd et coûteux (pour ne pas mentionner le travail impliqué dans le faire.)

Bleeding choses comme INotifyPropertyChanged, ObservableCollection, etc dans mes DTO semble être un hack.

Est-ce que quelqu'un a une meilleure solution? Suis-je fou? ;-)

Répondre

3

"Bleeding choses comme INotifyPropertyChanged, ObservableCollection, etc dans mes DTO semble être un hack."

Je ressens votre douleur, mais c'est l'approche que j'ai adoptée pour quelques projets.

Bottom line: Pour que la liaison de données WPF fonctionne comme annoncé, les objets/collections que vous liez doivent prendre en charge INotifyPropertyChanged et ObservableCollection. Personnellement, je pense que la création de DTO prenant en charge ce travail est beaucoup moins fastidieuse que la traduction constante de données dans un modèle de vue ou un autre objet intermédiaire qui est essentiellement une version plus riche de l'objet DTO.

1

Si vous en avez marre de taper du code pour INotifyPropertyChanged et que vous utilisez également des propriétés automatiques, pourquoi ne pas regarder MoXAML Power Toys, qui vous permet de convertir les propriétés automatiques en notifiables?

Questions connexes