WPF: TreeViewItem lié à un ICommand
Je suis en pleine création de mon premier MVVM application en WPF.
Fondamentalement le problème que j'ai c'est que j'ai un TreeView (Système d'.De Windows.Les contrôles.TreeView), que j'ai placé sur ma Fenêtre WPF, j'ai décider que je vais lier à un ReadOnlyCollection de CommandViewModel éléments, et ces éléments sont constitués d'un DisplayString, Tag et un RelayCommand.
Maintenant dans le code XAML, j'ai mon TreeView et j'ai lié avec succès mon ReadOnlyCollection. Je peux voir ce et tout semble parfait dans l'INTERFACE utilisateur.
Le problème maintenant est que j'ai besoin de lier la RelayCommand à la Commande de la TreeViewItem, mais à partir de ce que je peux voir la TreeViewItem ne dispose pas d'une Commande. Est-ce à force de me le faire dans la propriété IsSelected ou même dans le Code-behind de TreeView_SelectedItemChanged méthode ou est-il un moyen de le faire comme par magie dans WPF?
C'est le code que j'ai:
<TreeView BorderBrush="{x:Null}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<TreeView.Items>
<TreeViewItem
Header="New Commands"
ItemsSource="{Binding Commands}"
DisplayMemberPath="DisplayName"
IsExpanded="True">
</TreeViewItem>
</TreeView.Items>
et, idéalement, j'aimerais juste aller:
<TreeView BorderBrush="{x:Null}"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<TreeView.Items>
<TreeViewItem
Header="New Trade"
ItemsSource="{Binding Commands}"
DisplayMemberPath="DisplayName"
IsExpanded="True"
Command="{Binding Path=Command}">
</TreeViewItem>
</TreeView.Items>
Quelqu'un a une solution qui me permet d'utiliser le RelayCommand infrastructures j'ai.
Merci les gars, très apprécié!
Richard
OriginalL'auteur Richard | 2010-02-15
Vous devez vous connecter pour publier un commentaire.
Je sais que c'est "répondu" il y a un moment, mais depuis que les réponses n'étaient pas idéales, j'ai pensé que je l'avais mis dans mes deux cents. J'utilise une méthode qui me permet de ne pas avoir à recourir à un "style de bouton supercherie" ou même à l'aide de code-behind et au lieu conserve toute ma séparation de MVVM. Dans votre Arborescence ajouter le code xaml suivant:
Dans votre xaml en-tête ajouter:
et ensuite, vous devez ajouter une référence à l'assembly ci-dessus dans votre projet.
Après cela, tout est juste le même que n'importe quel autre commande, par exemple sur un bouton ou quelque chose.
Est
System.Windows.Interactivity
redistribuable?Oui, voir "C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Redist.en.txt".
Pour ceux qui ne veulent pas utiliser de Mélange, il suffit de créer un comportement.
Un "Thinking out-of-the-box" solution peut-être? 🙂
OriginalL'auteur
Merci pour l'entrée dans la question, et oui, j'ai dit que je ne voulais pas de Code derrière solution, mais à l'époque j'étais encore sous l'impression que j'étais tout simplement manque quelque chose... je me suis donc retrouvé à l'aide de la TreeView_SelectedItemChanged événement.
Même si la Volonté approche semble être une bonne contourner, pour ma situation personnelle, j'ai décidé que je voudrais utiliser le code derrière. La raison pour cela est que le point de Vue et XAML restera comme elle le serait si le TreeViewItem avait une "Commande" de la propriété à laquelle ma Commande pourrait être lié. Maintenant, je n'ai pas à modifier les Modèles ou les points de Vue, tout ce que j'ai à faire est d'ajouter le code et la Manifestation pour le TreeView_SelectedItemChanged.
Ma solution:
Comme j'ai déjà le RelayCommand attaché à la TreeViewItem, tout ce que je suis en train de faire est de simplement appeler manuellement la méthode "Execute" sur le RelayCommand.
Si c'est le complètement de mauvaise façon de le faire alors s'il vous plaît laissez-moi savoir...
Merci!
OriginalL'auteur
Ce que je voudrais faire est de mettre en l'en-Tête de la TreeViewItem à un bouton, puis de la peau sur le bouton de manière à ne pas regarder ou agir comme un, puis effectuer ma commande de liaison à l'encontre de la touche.
Vous pourriez avoir besoin pour ce faire par l'intermédiaire d'un DataTemplate, ou vous pourriez avoir besoin de changer le modèle de la TreeViewItem lui-même. Jamais fait, mais c'est de cette façon que j'ai fait des choses similaires (tels que l'onglet en-têtes de page).
Voici un exemple de ce dont je parle (vous pouvez déposer ce de Kaxaml et de jouer avec elle):
J'ai créé un nouveau style clair pour un bouton. J'ai ensuite il suffit de déposer un bouton dans l'engraissement du point et de définir son style. Vous pouvez faire la même chose en utilisant des modèles de données, bien sûr.
mise à jour de l'échantillon
Merci pour la mise à jour et je vois que ce serait probablement travailler. J'ai passé un itinéraire différent, mais très reconnaissants de l'aide. J'espère que cela va aider quelqu'un d'autre qui a ce problème.
OriginalL'auteur
C'est un bon exemple de la façon dont le MVVM est très bien une arrière-pensée dans WPF. Vous vous attendez à être d'aide au Commandement de certaines gui éléments, mais il n'y en a pas, donc vous êtes obligé de passer par un processus complexe (comme indiqué dans la Volonté exemple) juste pour obtenir une commande attaché à quelque chose.
Espérons qu'ils traiter de cette question dans WPF 2.0 🙂
OriginalL'auteur
Je l'amélioration de la bonne solution de Richard par la propriété Tag:
Mavue.xaml:
Mavue.xaml.cs
MyViewModel.cs
OriginalL'auteur