2009-07-28 8 views
1

J'utilise PRISM (et donc le modèle MVVM). J'ai une vue complexe du sélecteur DateTime avec des boutons radio. L'utilisateur peut choisir aujourd'hui, hier, une date, une semaine d'une année, etc. J'utilise des boutons radio pour les différents choix.Comment utiliser RadioButtons et le modèle MVVM

Quelle est la meilleure façon de faire cela dans MVVM? Je ne peux vraiment pas penser à une manière propre. Je pourrais créer beaucoup de comportements personnalisés à ajouter à chaque élément pour les suivre, mais il ne semble pas maintenable.

Je vais mettre du code en arrière mais je n'aime vraiment pas ça et pour moi ça casse le principe MVVM (tout mettre dans le XAML).

Est-ce que quelqu'un a une meilleure idée sur la façon de s'y prendre?

Répondre

0

Que diriez-vous d'un ComboBox au lieu des RadioButton s présentant une liste de TimeOffset (classe personnalisée) liés à votre ViewModel, avec une propriété SelectedTimeOffest correspondant.
Si vous devez afficher des informations supplémentaires en fonction du type de TimeOffset, par ex. un WeekOffset (sous-classe de TimeOfset) avec une propriété WeekCount, avoir un contrôle de contenu avec plusieurs DataTemplate s personnalisés par le type de TimeOFfset.

Juste une idée ...

0

Le ViewModel est conçu pour présenter le modèle d'une manière la vue peut consommer.

Dans ce cas, vous pouvez avoir une propriété booléenne pour chaque bouton de la machine virtuelle, et lorsqu'un bouton est mis à jour, il définit simplement toutes les autres propriétés sur false. Ensuite, dans votre vue, vous pouvez lier chaque propriété IsChecked à la propriété correspondante dans le ViewModel.

Sachez également qu'il existe actuellement un bug dans les boutons radio de liaison dans WPF. Here's une solution potentielle.

+0

Wow, j'ai posté il y a que les âges de bugs et je ne s'est pas rendu compte qu'il a eu tant d'attention;) Notez que c'est corrigé dans .NET 4 cependant. –

+0

@JC Donc vous êtes responsable! : P –

2

Conservez les boutons radio, ajoutez un type enum à votre machine virtuelle qui peut renvoyer des éléments tels que "Aujourd'hui" "Hier" ou "Demain". Du côté de l'interface utilisateur, créez un ValueConverter qui prend un paramètre comme "Tomorrow" et le compare avec la valeur liée sur VM, puis retourne le bool? nécessaire par IsChecked.

1

Mettez le code derrière.

Le modèle M-V-VM n'est pas "tout mettre en xaml" c'est "des préoccupations séparées". Votre machine virtuelle veut un droit DateTime? Dans ce cas, il ne se soucie pas comment DateTime est choisi, il a juste besoin d'un DateTime. Mettre la logique View dans le ViewModel n'est pas une bonne idée car vous donnez maintenant à la VM des informations sur le fonctionnement de la vue. Le flux est censé être View sait sur le ViewModel qui connaît le modèle. L'inverse n'est normalement pas vrai. (Comme pour tout ce qui touche à l'informatique, il y a toujours des exceptions)

J'espère que cela vous aidera.

Questions connexes