Commands aus ListView ausführen
19.09.09 - .NET, WPF
Beitrag von Norbert Eder
Beitrag von Norbert Eder
Mit Hilfe einer ListView ist es einfach möglich, Daten aus einer Datenquelle darzustellen. Dazu ist lediglich die Eigenschaft View zu definieren. Durch die Angabe von GridViewColumn Elementen und dem dazugehörigen DisplayMemberBindings werden die Daten aus der zugewiesenen Datenquelle auch schon angezeigt.
<ListView ItemsSource="{Binding MyOpenTickets}" BorderThickness="0" Margin="4"> <ListView.View> <GridView> <GridViewColumn Header="Id" DisplayMemberBinding="{Binding Id}"/> <GridViewColumn Header="Name" DisplayMemberBinding={Binding Name}/> <GridViewColumn Header="Version" DisplayMemberBinding="{Binding Version.Name}"/> <GridViewColumn Header="Status" DisplayMemberBinding="{Binding State}"/> </GridView> </ListView.View> </ListView> Eine Anforderung ist nun sehr oft, dass die angezeigten Daten in einem Detailfenster geöffnet werden sollen. Dazu muss - idealerweise - ein Command untergebracht werden. Dies kann durch die Angabe eines CellTemplates bewerkstelligt werden. <ListView ItemsSource="{Binding MyOpenTickets}" BorderThickness="0" Margin="4"> <ListView.View> <GridView> <GridViewColumn Header="Id" DisplayMemberBinding="{Binding Id}"/> <GridViewColumn Header="Name" CellTemplate="{StaticResource TicketClickableButton}"/> <GridViewColumn Header="Version" DisplayMemberBinding="{Binding Version.Name}"/> <GridViewColumn Header="Status" DisplayMemberBinding="{Binding State}"/> </GridView> </ListView.View> </ListView> In der zweiten GridViewColumn-Definition wird das CellTemplate definiert. Zu beachten ist an dieser Stelle, dass kein DisplayMemberBinding angegeben werden darf. Hier nun das verwendete Template: <DataTemplate x:Key="TicketClickableButton"> <Button Command="{Binding OpenTicketCommand}" Content="{Binding Name}" Style="{StaticResource ProjectLinkButton}" /> </DataTemplate> Das Template stellt eine einfache Schaltfläche dar, welche an einen Command gebunden ist. Zusätzlich wird an der Schaltfläche das Binding definiert. Eine mögliche Umsetzung kann so aussehen: ![]() | |
martin
26.09.09
| Hallo,
was mir nicht ganz an der Lösung gefällt ist: Dass man in diesem Beispiel, den Dialog nur öffnen kann wenn man in die Spalte Name klickt. Normalerweise ist es doch so, dass man durch einen doppelklick in der Zeile, egal in welcher Spalte man geklickt hat, den zu bearbeitenen Dialog aufrufen kann. Nun müsste man nach deinem Schema, wenn ich das so richtig verstanden habe, für jede Spalte extra ein CellTemplate erstellen. Ich würde das Problem so angehen: Einen Style für das ListViewItem schreiben und in diesem den Command festlegen (z.B. mit AttachedCommands). Somit kann man das DisplayMemberBinding wie gewohnt nutzen und muss nicht für jede Spalte ein CellTemplate erstellen. lg martin | |
Norbert
29.09.09
| Hallo, danke für deine Anmerkung.
Dein beschriebenes Verhalten ist natürlich in Orndung, wenn grundsätzlich bei einem Doppelklick die Detailinformationen geöffnet werden sollen. Oftmals bietet eine Tabelle jedoch mehrere Aktionen, die dann eigens behandelt werden müssen. Dies sollte ein Beispiel sein, wie diese Anforderung gemeistert werden kann. | |
Kommentar hinzufügen
Bitte das Formular ausfüllen, um Deinen Kommentar hinzuzufügen.
