2010-07-18 3 views
6

J'ai une liste déroulante liée à une collection, de sorte que l'utilisateur peut sélectionner l'un des éléments. Jusqu'ici tout va bien.Puis-je avoir un ValueConverter dans mon ViewModel?

Le contenu de la zone de liste modifiable est piloté par l'élément, mais également par une valeur dans mon modèle de vue. Imaginez la valeur dans mon viewmodel est la langue, j'ai un dictionnaire de descriptions par langue dans mon article lié, et je veux afficher le bon.

Comment dois-je procéder?

Répondre

1

Créez une collection observable dans votre viewmodel de type Item. Liez l'itemource de votre viewmodel à cette collection observable.

public class Item 
{ 
public String description {get;set;} 
public String language {get;set;} 
public override ToString() 
{ 
     return description; 
} 
} 

L'élément sélectionné doit également être lié à une propriété de type Item.

La substitution de ToString affiche la description.

La propriété d'élément sélectionné contiendra une référence à la propriété d'objet sélectionnée dont vous pouvez obtenir la langue.

2

Ceci est un exemple classique de la raison pour laquelle ViewModel existe - vous voulez avoir une logique qui dépend de l'état trivial dans la vue, ainsi que du modèle principal. Imaginez que vous écrivez un test unitaire à exécuter sur ViewModel pour ce comportement. Vous auriez besoin du ViewModel pour faire correspondre une propriété à l'élément sélectionné. Le ViewModel possède également une autre propriété qui varie en fonction de cet élément sélectionné ainsi que l'autre valeur dans le ViewModel que vous avez mentionné.

Je considère cela comme l'approche pilotée par les tests de la conception ViewModel - si vous ne pouvez pas écrire un test unitaire pour l'évaluer, vous n'avez pas le bon mélange d'interfaces état et publié. Donc, oui, le ViewModel peut résoudre le problème et si vous y mettez tout l'état, vous pouvez faire l'unification dans le ViewModel.

+0

Andy, c'est la solution avec laquelle je serais le plus à l'aise, mais je n'arrive pas à trouver la meilleure façon de le faire. Devrais-je implémenter un type personnalisé pour que la zone de liste déroulante puisse se lier à, et quand je suis averti d'un changement, je devrais repousser la valeur au modèle? –

+0

Voulez-vous que l'ensemble des descriptions du combo change en fonction de cette autre valeur? –

+0

Désolé Andy, j'ai raté votre commentaire. Oui, j'ai besoin de l'ensemble des descriptions pour changer. Je peux penser à quelques façons de le faire, aucun d'entre eux particulièrement bon :) –