2010-10-21 8 views
0

J'utilise PRISM v2, CAL, SL4 et MVVM et ai une commande de délégué sur mon ViewModel appelée CheckCommand. Le ItemsControl contient une case à cocher et j'essaye d'obtenir les articles dans ItemsControl/Checkbox pour lancer cette commande quand elle est vérifiée - mais ce n'est pas la communication de retour au viewmodel!SL ItemsControl, commande sur ViewModel ne se déclenche pas à partir de ItemsControl (CheckBox)

Je pense que c'est parce que chaque élément 'datacontext' est l'objet individuel auquel l'élément est lié, plutôt que le ViewModel?
- Ma suspicion est en fait correcte, parce que si je déplace mon DelegateCommand hors du viewmodel et dans la classe définissant les éléments dans itemscontrol je peux voir les commandes/méthodes être viré!

Vue:

<ListBox x:Name="BasketListBox" ItemsSource="{Binding BasketCollection}" MinWidth="200"> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <CheckBox commands:Checked.Command="{Binding CheckCommand}" IsChecked="False" </CheckBox> 
    </DataTemplate>  
</ListBox.ItemTemplate> 

me point Quelqu'un peut-il dans la bonne direction s'il vous plaît?

Cheers, Mcad.

EDIT 1:

Le commandant fonctionne maintenant, voir solution ci-dessous. MAIS, je rencontre maintenant un autre problème:
"Une exception s'est produite lors de la création d'une région avec le nom" basketRegion "à l'exception: System.InvalidOperationException: la propriété ItemsControl ItemsControl n'est pas vide.Ce contrôle est associé à une région, mais Si vous n'avez pas défini explicitement la propriété ItemSource du contrôle, cette exception peut être provoquée par une modification de la valeur de la propriété attachée RegionManager héritée. "

Créer une question distincte pour ce problème. plus propre:

PRISM-MVVM, ItemsControl problem with View injection

+1

C'est l'une des principales limites du modèle de commande. La seule façon que j'ai pu contourner est que j'ai écrit un comportement personnalisé similaire au comportement de Prism pour commander mais il a une option pour spécifier un nom de chaîne d'une commande au lieu d'une liaison, puis il recherche le VisualTree à ItemsControl et utilise son DataContext pour la liaison. – Stephan

Répondre

1

Vous voulez que tous les CheckBox lancent la même commande? Vous pouvez:

<CheckBox commands:Checked.Command="{Binding DataContext.CheckCommand, ElementName=BasketListBox}" 

Ou vous pourriez avoir tous les modèles de vue des enfants exposer la commande via leur propre propriété.

+0

Mon message ci-dessous de temps en temps me donne l'erreur suivante lors de l'exécution de mon code: Une exception s'est produite lors de la création d'une région avec le nom 'basketRegion'. L'exception était: System.InvalidOperationException: la propriété ItemsSource de ItemsControl n'est pas vide. Ce contrôle est associé à une région, mais le contrôle est déjà lié à autre chose. Si vous n'avez pas explicitement défini la propriété ItemSource du contrôle, cette exception peut être provoquée par une modification de la valeur de la propriété jointe RegionManager héritée. – Mcad001

+0

Je suppose que le problème est que je lie la ItemsSource de la listbox à basketcollection, puis je lie "{Binding DataContext.CheckCommand, ElementName = basketListBox}" ...Mais si je supprime l'ItemsSource je ne peux pas remplir ma Listbox, aucune idée pour résoudre ce problème? – Mcad001

+0

Créé question séparée pour ce problème pour le rendre plus propre: http://stackoverflow.com/questions/4022303/prism-mvvm-itemscontrol-problem-with-view-injection – Mcad001

0

Thanx Kent. Vous me mettez sur la bonne voie pour résoudre ce problème, a fini par faire ceci:

<ListBox x:Name="basketListBox" ItemsSource="{Binding basketcollection}" MinWidth="200"> 
<ListBox.ItemTemplate> 
<DataTemplate> 
     <CheckBox commands:Checked1.Command="{Binding DataContext.CheckCommand, ElementName=basketListBox}" Content="{Binding basketName}">    </CheckBox> 
    </DataTemplate>  
</ListBox.ItemTemplate> 

Questions connexes