2010-06-02 4 views
1

Je suis relativement nouveau à WPF, et j'ai des problèmes avec ce que je suis assez certain d'un problème relativement simple.Manipuler des collections et le modèle ViewModel

J'ai mon objet de données sous-jacentes, une personne:

class Person 
{ 
    public string Surname {get; set; } 
    public string Firstname {get; set; } 
    public List<Address> Addresses {get; } 
} 

et je souhaite afficher et modifier cet objet dans mon application WPF. À cette fin, j'ai créé un ViewModel que je lie dans mon XAML:

class PersonViewModel 
{ 
    public string Fullname {get; } 
    public ObservableCollection<AddressViewModel> Addresses {get; } 
} 

Cela est bien, sauf quand il s'agit de manipuler ma collection d'adresses, où je ne peux pas travailler ce que je devrais faire :

  • Dois-je ajouter des méthodes AddAddress, RemoveAddress etc ... à ma PersonViewModel classe pour manipuler ma collection avec des instances de AddressViewModel
  • Dois-je ajouter que les instances de AddressViewModel à mon Addresses observab le collection

Les deux ci-dessus semblent un peu brouillon - est-ce qu'il y a une meilleure façon de traiter les collections?

Répondre

2

Je vous recommande d'ajouter des commandes dans votre ViewModel. Par exemple, vous auriez une AddAddressCommand et une RemoveAddressCommand. vous pouvez lier ces commandes à la vue (par exemple, vous pouvez lier un bouton à AddAddressCommand) qui exécutera une méthode dans votre ViewModel qui s'ajoutera à la collection.

 public ObservableCollection<AddressViewModel> Addresses { get; set; } 

    public RelayCommand AddAddressCommand 
    { 
     get 
     { 
      if (_addAddressCommand == null) 
      { 
       _addAddressCommand = new RelayCommand(p => this.AddAddress_Execute()); 
      } 
      return _addAddressCommand; 
     } 
    } 

    private void AddAddress_Execute() 
    { 
     Addresses.Add(new AddressViewModel()); 
    } 

(Dans l'exemple ci-dessus j'utilise RelayCommand, ceci est une classe personnalisée qui implémente ICommand, vous pouvez en savoir plus sur ce RelayCommand here

également une note de côté: Je ne crée pas un AddressViewModel Je voudrais juste avoir un AddressModel qui implémente INotifyPropertyChanged Il n'est pas nécessaire d'avoir une autre adresse viewmodel sauf si vous avez une logique d'affichage qui n'est pas dans votre modèle

+0

Vous pouvez remplacer votre affectation if + par un opérateur ?? - – Henrik

+0

aah cool, merci –

+0

Vous allez aussi devoir ajouter une adresse à Person.Addresses dans AddAddress_Execute pour aller avec le nouveau AddressVM ou faire une synchronisation des collections plus tard, comme dans une opération Save. –

Questions connexes