0

J'ai EmployeeList en tant que observableCollection de Employee Object.Est-il possible d'utiliser IMultiValueConverter pour une liste d'éléments?

L'objet employé a un salaire. Je veux afficher quelques valeurs comme salaire moyen des employés en XAML, et le champ UI devrait être automatiquement mis à jour quand un élément est ajouté à la liste ou lorsque le champ Salaire est modifié dans l'un des éléments mis à jour. Cela peut être réalisé en créant une propriété pour la moyenne et en écoutant les gestionnaires de collections modifiées et ProperyChanged dans la liste. Mais, je suis sûr qu'il devrait y avoir un autre meilleur moyen de le faire. (Comme en utilisant AttachedProperties ou IValueConverter/IMultiValueConverter)

En ce qui concerne cela, j'ai des questions suivantes.

  1. est-il possible d'utiliser IMultiValueConverter pour une liste/ObservableCollection des articles? Le convertisseur doit être appelé quand un élément ajouté à la liste ainsi que lorsqu'une propriété particulière a changé?

Répondre

1

L'utilisation d'une propriété est définitivement la solution, surtout du point de vue MVVM. Pensez Occam's Razor: fondamentalement, la solution la plus simple est généralement la meilleure.

C'est certainement la solution la plus propre, et donc la plus facile à entretenir. De plus, il est le plus extensible (vous pouvez facilement ajouter de nouvelles propriétés pour différents calculs si vous le souhaitez). Tout ce que vous avez à faire est de créer des propriétés en lecture seule, et d'appeler PropertyChanged avec le nom de cette propriété lorsque la collection change (ce qui ressemble à ce que vous faites).

Par exemple, voici une « moyenne » propriété:

public Double Average 
{ 
    get { return mMyCollection.Average(); } 
} 

void mMyCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    PropertyChanged(this, new PropertyChangedEventArgs("Average")); 
} 

Les propriétés attachées ne fonctionneront pas - ils sont pour spécifier la propriété d'un parent dans un élément enfant.

ValueConverters fonctionnerait, en théorie (bien qu'ils devraient probablement être sur chaque élément de la liste, ainsi que la collection entière), mais vous ne convertissez pas vraiment quelque chose, vous fournissez des données supplémentaires basées sur existantes Les données. Pour ce faire, vous devrez vous balader avec toutes sortes de modèles, et chaque fois que vous avez besoin de changer quoi que ce soit, vous aurez besoin de traîner avec eux à nouveau. Il deviendrait complexe à la hâte et sans bénéfice.