2009-05-14 24 views
3

Je voudrais implémenter une case à cocher tout sélectionner dans xaml.
J'ai plusieurs cases (modèles) dans une liste. Ensuite, j'ai une case à cocher en dehors de la liste, que je veux avoir un comportement "select all". Je pourrais facilement résoudre le problème dans mon ViewModel, cependant, je pense qu'il serait plus élégant de le faire dans xaml, puisque la case à cocher select all n'a (directement) rien à voir avec mon ViewModel. Le code ressemble à ceci:Sélectionner tout Case à cocher en XAML en utilisant le déclencheur?

<ListView> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
     <CheckBox Content="Globale Eingabe" 
      Name="SelectSingle" 
      IsChecked="{Binding IsChecked}"> 
     </CheckBox> 
    </DataTemplate> 
<ListView.ItemTemplate> 
</ListView> 
<CheckBox Name="SelectAll" /> 

Comme vous le voyez la propriété IsChecked du SelectSingle est déjà lié à mon ViewModel. Je pense donc que j'ai besoin d'un déclencheur pour manipuler l'état de la case à cocher.

Maintenant, je l'ai déjà essayé STH comme ceci:

<CheckBox Content="Globale Eingabe" 
    Name="SelectSingle" 
    IsChecked="{Binding IsChecked}"> 
    <CheckBox.Triggers> 
     <Trigger SourceName="SelectAll" Property="IsChecked" Value="True"> 
      <Setter TargetName="SelectSingle" Property="IsChecked" Value="True"/> 
     </Trigger> 
    </CheckBox.Triggers> 
</CheckBox> 

ou qqch comme ceci:

<CheckBox Content="Globale Eingabe" 
    Name="SelectSingle" 
    IsChecked="{Binding IsChecked}"> 
    <CheckBox.Triggers> 
     <DataTrigger Binding="{Binding ElementName=SelectAll, Path=IsChecked}" 
      Value="True"> 
      <Setter TargetName="Check" 
       Property="IsChecked" 
       Value="True"/> 
     </DataTrigger> 
    </CheckBox.Triggers> 
</CheckBox> 

J'ai essayé aussi la même chose dans un style, mais en vain. Je reçois toujours une erreur, sth le long des lignes de "membre statique" IsCheckedProperty ne peut pas être trouvé dans le type "ContentPresenter" "

Maintenant, cela semble que la liaison Target/SourceName ne fonctionnerait pas, mais pourquoi? y at-il quelque chose que je suis absent?

Répondre

3

Je pense que vous devriez mettre la logique Check All dans le ViewModel après tout. Dans this Code Project article, WPF Guro Josh Smith résout un problème similaire (dans son cas c'est TreeView et non ListView) dans le ViewModel avec le titre suivant: "Mettre les Smarts dans un ViewModel".
Je pense qu'il serait plus facile d'implémenter et de déboguer cette logique dans le ViewModel, plutôt que de faire un MultiBinding compliqué que vous ne sauriez pas où il vous mordra.
Dernière remarque - Je suivrais toujours le conseil de Josh :-)

+0

Je ne suis pas très satisfait de cela, car ce n'est explicitement pas ce que je voulais. Cependant, je suppose que c'est plus facile (plus laid) que de le faire de façon plus compliquée (plus belle) (je suppose que c'est compliqué, à son tour, c'est plus laid de toute façon). – Torsten

0

Torsten, je suis désolé si je ne comprenais pas ce que vous avez déjà essayé, mais vous devez lier la propriété IsChecked des cases à cocher dans la ListView à la propriété de IsChecked le CheckBox à l'extérieur en utilisant:

IsChecked="{Binding Path=IsChecked, Mode=OneWay,ElementName=OutsideCheckBox}" 
+0

non désolé. ce n'est pas tout à fait ce que je veux. Les cases "single" sont déjà liées à mes objets ViewModel comme vous pouvez le voir dans la première liste. Maintenant, je veux aussi lier la propriété IsChecked checkbox unique à la case à cocher "Tous" IsChecked Property. Je tripote avec MultiBinding atm, mais je n'ai pas encore résolu ça. – Torsten

Questions connexes