2010-02-11 2 views
2

Imaginez que j'ai un UserControl qui montre un parking (mon analogie préférée) avec des voitures de différentes couleurs. Vous pouvez sélectionner une voiture, et dans un UserControl séparé (dans un projet séparé) les statistiques de la voiture sélectionnée sont affichées.Question de communication ViewModel

Maintenant, un utilisateur veut un bouton sur la voiture statistiques UC, «Prochaine voiture de même couleur». Une fois sélectionné, il devrait afficher les statistiques de la voiture suivante (de haut en bas, de gauche à droite) sur le parking avec la même couleur. Donc, si cela a du sens, à la question.?

J'utilise actuellement MVVM Lite pour envoyer un message contenant la voiture choisie dans le terrain de stationnement UC à la statistique de voiture UC. Tout est bon. Maintenant, avec cette nouvelle fonctionnalité, que dois-je faire? La statistique UC doit demander la prochaine voiture du parking UC.

Serait-ce un bon endroit pour utiliser l'injection de dépendance? Ou y a-t-il une autre meilleure approche?

Répondre

1

Si je vous ai bien compris, ce que vous voulez, c'est une commande avec des paramètres de commande corrects.

public class Car 
    { 
    public Car(ParkingLot lot) 
    { 
     _parkingLot = lot; 
    } 

    public string Color { get; set; } 

    public ParkingLot ParkingLot 
    { 
     get 
     { 
      return _parkingLot; 
     } 
    } 

    private ParkingLot _parkingLot; 
} 

public class ParkingLot : ObservableCollection<Car> 
{ 
    public Car SelectedCar { get; set; } 

    public ICommand ShowNextCarCommand { 
     get 
     { 
      if (_showNextCar == null) 
      { 
       _showNextCar = new DelegateCommand(OnShowNextCar); 
      } 

      return _showNextCar; 
     } 
    } 

    private void OnShowNextCar() 
    { 
     string currentColor = SelectedCar.Color; 
     //Write proper logic to get the next Car. Here you got the currently selected car with you and the color 
     SelectedCar = this.NEXT(s => s.Color == currentColor); //Write the NEXT() logic   
    } 

    ICommand _showNextCar; 
} 

Maintenant, il est une question de réglage Button.Command = « {Binding ParkingLot.ShowNextCarCommand} » maintenant vous avez obtenu votre contrôle sur la classe Parkinglot ViewModel et de trouver la voiture de même couleur et effectuez le réglage à nouveau à SelectedCar propriété. Je suppose que vous aurez RaisepropertyChanged dans toutes ces propriétés. J'utilise DelegateCommand simple prisme

+0

Cela semble être une bonne idée! Je vais donner une première chose. Im assez mauvais avec les commandes, je ne sais tout simplement pas ce que je peux faire avec eux et ce que je ne peux pas. Merci pour le bon exemple aussi. – Nicros

+0

Je ne comprends pas pourquoi votre classe Car a une référence au ParkingLot. Il semble que Car n'a vraiment besoin de connaître sa couleur. Comme le ParkingLot est en fait juste une liste de voitures (il devrait probablement s'agir d'un tableau clairsemé?), Seulement il devrait avoir la responsabilité de savoir quelle voiture a été sélectionnée, et laquelle est la suivante. – Dave

+0

Oui Dave, je suis tout à fait d'accord que la classe Car n'a pas l'air bien avec sa connaissance de ParkingLot. mais je voulais montrer l'idée d'appeler la commande d'une autre classe VM c'est tout. Il y a une meilleure façon d'obtenir le ParkingLot dataContext au niveau XAML quand même. –

0

J'utiliser un contrôleur en tant que médiateur entre les deux ViewModels (ParkingLotViewModel et StatisticsViewModel). Dans votre cas, le contrôleur est responsable de la synchronisation de la voiture sélectionnée et il est responsable de transmettre la commande «Sélectionner la prochaine voiture de la même couleur» au modèle ParkingLotViewModel. Les exemples d'application du WPF Application Framework (WAF) montrent comment cela peut fonctionner.

.

jbe