2009-12-04 6 views
1

Dans WPF, j'ai un ListBox avec un UserControl en tant que ItemTemplate - toutes les données sont affichées ok. J'ai maintenant ajouté une zone de texte pour la saisie dans ce contrôle utilisateur. Dans une conception MVVM, je souhaite effectuer une action (recalculer les valeurs) dans la fenêtre principale lorsque l'utilisateur modifie le contenu de la zone de texte dans le contrôle utilisateur, dans le modèle d'élément, dans la zone de liste. La question est - comment propager cet événement jusqu'au modèle? Le contrôle de l'utilisateur est lié à un objet métier et je peux voir la valeur qui y est changée ok (INotifyPropertyChanged est implémenté dans le BO), mais, comment faire passer cet événement au modèle (par opposition au code-behind)? Tous les exemples ou les pointeurs les plus bienvenus!Événements de UserControl en tant que ItemTemplate dans WPF ListBox

Jas

Répondre

0

Je suppose, étant donné que c'est une application MVVM, que vous essayez de propager l'événement changé de texte jusqu'à la ViewModel.

Vous pouvez le faire sans ajouter de code dans la vue en utilisant un Attached Property ou un comportement. Il existe en fait un comportement dans la galerie d'expressions qui appelle une commande lorsque vous cliquez sur Enter in a TextBox. Cela pourrait facilement être retravaillé pour déclencher un ICommand personnalisé sur votre ViewModel chaque fois que le TextBox change sa valeur (c'est très similaire dans les objectifs).

+0

Merci de m'avoir indiqué ces zones jusqu'ici inexplorées. Supposons que je devais implémenter un comportement avec un ICommand dans le contrôle utilisateur (dans le modèle d'élément, dans la zone de liste), je ne vois pas très bien comment cela serait possible au niveau supérieur, où la zone de liste est située. Ou, peut-être ma hiérarchie listbox/itemtemplate/usercontrol/textbox est-elle défectueuse? Merci pour les liens - quelques plus de coups s'il vous plaît seraient utiles. L'exemple du lien foll est utile aussi, et les comportements semblent être la bonne idée (voir http://codeblitz.wordpress.com/2009/07/01/wpf-editable-behavior-for-labels/) – jas

+0

Ceci permet vous pouvez potentiellement lier votre texte à une commande dans le ViewModel, ce qui vous permet de définir des propriétés ou d'élever des événements pouvant propager la chaîne. De plus, après avoir relu ceci, j'ai réalisé que vous pourriez utiliser un événement routé pour propager l'événement depuis votre UserControl jusqu'à vos interfaces de plus haut niveau, qui à leur tour peuvent les gérer comme ils le souhaitent. (Ils vous laissent propager n'importe quel nombre de "niveaux" dans l'arbre visuel ...) –

+0

Comme il s'est avéré, j'ai réalisé ce que je voulais avec une simple propriété de dépendance. En route, j'avais deux problèmes: le DP n'avait pas été bidirectionnel et je n'avais pas la syntaxe de liaison correcte (ce qui fonctionnait: "{Binding Path = DataContext.MyValue, RelativeSource = {RelativeSource FindAncestor, AncestorType = {x: Type ListBox }}, UpdateSourceTrigger = PropertyChanged} "). Merci pour vos suggestions – jas

Questions connexes