Ich habe ein ziemlich lustiges Problem mit WPF. Ich habe eine Baumansicht und die Auswahl von Elementen funktioniert soweit. Das Problem ist, ich möchte das aktuell ausgewählte Element abwählen, wenn der Benutzer in den leeren Bereich der Baumansicht klickt. Standardmäßig hält das treeview das aktuelle Element ausgewählt, und ich habe ein Kontextmenü-Option hinzugefügt, um es zu deaktivieren, was ziemlich hardcore ist:Wie Sie alle ausgewählten Elemente in einer WPF-Strukturansicht abwählen, wenn Sie auf einen leeren Bereich klicken?
// Note: This is done recursivly from the start, so it
// works for child items as well
treeView.ItemContainerGenerator.ContainerFromItem(treeView.SelectedItem) as TreeViewItem).IsSelected = false;
Darüber hinaus ist dies kontraintuitiv, da es dem Benutzer erfordert, Klicken Sie mit der rechten Maustaste zuerst, und zweitens, nachdem Sie auf diese Weise die Auswahl aufgehoben haben, kann der Benutzer sie nicht mehr auswählen, indem er auf das Element klickt. Wie soll das funktionieren?
Edit: Einige weitere Informationen: Ich habe einen Handler zum TreeView
hinzugefügt Mausklickereignisse zu handhaben, aber der Absender ist immer eine TreeView
Instanz, auch wenn ich direkt auf einem TreeViewItem
klicken. Wenn ich stattdessen einen Handler zu meinem TreeView.ItemTemplate
hinzufüge (d. H. Dem ersten Kind in der Vorlage), erhalte ich niemals Ereignisse, wenn ich auf den leeren Bereich klicke (was ziemlich logisch ist). Der Code sieht wie folgt aus:
private void MyTreeView_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if ((sender as TreeViewItem) == null)
{
// Always triggered
System.Diagnostics.Trace.Write("Empty area clicked");
}
}
Und die XAML hierfür ist:
<TreeView x:Name="MyTreeView" Margin="3" MouseUp="MyTreeView_MouseUp">
Funktioniert nicht, weil der Absender nach der Auswahl eines Elements an das aktuell ausgewählte Element gebunden ist - das heißt, auch wenn ich in den leeren Bereich klicke, Absender == das aktuell ausgewählte Element. – Anteru
Hmm. Wenn Sie auf die TreeView selbst klicken, sollte der Absender eine TreeView (kein TreeViewItem) sein. Hast du diesen Handler zur TreeView oder zu jedem TreeViewItem hinzugefügt? Verwenden Sie das Standard-TreeView oder ein benutzerdefiniertes? – Pwninstein
Ahh das Problem ist, ich bekomme kein TreeViewItem, sondern eine Instanz meiner viewmodel Klasse, für die ich das entsprechende TreeViewItem finden muss. Schlimmer noch, nachdem ich ein Element programmgesteuert deaktiviert habe, kann ich es nicht erneut auswählen, indem ich darauf klicke. – Anteru