2009-05-14 21 views
3

Ich möchte ein Kontrollkästchen alle Kontrollkästchen in XAML implementieren.
Ich habe mehrere (templated) Checkboxen in einer Listview. Dann habe ich eine Checkbox außerhalb der Listenansicht, die ein "Alles auswählen" Verhalten haben soll. Ich könnte das Problem in meinem ViewModel leicht lösen, aber ich denke, es wäre eleganter, dies in XAML zu tun, da das Kontrollkästchen "Alle auswählen" (direkt) nichts mit meinem ViewModel zu tun hat. Der Code sieht etwa so aus:Wählen Sie alle Checkbox in XAML mit Trigger?

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

Wie Sie das IsChecked Eigentum des SelectSingle sehen ist bereits an mein Viewmodel gebunden. Also ich denke, ich brauche einen Trigger, um den Status der Checkbox zu manipulieren.

Jetzt habe ich versucht, schon etw wie folgt aus:

<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> 

oder etw wie folgt aus:

<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> 

ich das gleiche auch in einem Stil versucht, aber ohne Erfolg. Ich erhalte immer einen Fehler, etw in der Art von "static member" IsCheckedProperty konnte nicht im Typ "ContentPresenter" gefunden werden.

Das hört sich jetzt so an, als würde die Target/SourceName-Bindung nicht funktionieren, aber warum? gibt es etwas, das ich vermisst?

Antwort

3

Ich denke, dass Sie die Check-All-Logik in das ViewModel stellen sollten. In this Code Project article löst WPF Guro Josh Smith ein ähnliches Problem (in seinem Fall ist es TreeView und nicht ListView) im ViewModel mit dem folgenden Titel: "Putting die Smarts in einem ViewModel".
Ich denke, es wäre einfacher, diese Logik im ViewModel zu implementieren und zu debuggen, als einige komplizierte MultiBinding zu tun, dass Sie nicht wissen würden, wo es Sie beißen wird.
Letzte Anmerkung - Ich würde immer Joshs Rat folgen :-)

+0

Ich bin nicht ganz zufrieden damit, da dies explizit nicht das ist, was ich wollte. Aber ich denke, es ist einfacher (hässlicher) als besser, es komplizierter (schöner) zu machen (ich denke, kompliziert macht es wiederum hässlicher). – Torsten

0

Torsten, es tut mir leid, wenn ich nicht verstehen, was Sie bereits versucht haben, aber Sie müssen die IsChecked Eigentum der Checkboxen in der ListView auf die IsChecked Eigenschaft binden die CheckBox außerhalb es mit:

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

keine Entschuldigung. es ist nicht ganz das, was ich will. Die Kontrollkästchen "single" sind bereits an meine ViewModel-Objekte gebunden, wie Sie in der ersten Liste sehen können. Jetzt möchte ich auch die einzelne Checkbox IsChecked Property an die "all" Checkbox IsChecked Property binden. Ich fummle mit MultiBinding ATM herum, aber ich habe das noch nicht gelöst. – Torsten