Tengo un problema bastante gracioso con WPF. Tengo una vista en árbol, y la selección de elementos funciona bien hasta el momento. El problema es que quiero deseleccionar el elemento seleccionado actualmente cuando el usuario hace clic dentro del área en blanco de la vista en árbol. Por defecto, la vista de árbol mantiene el elemento actual seleccionado, y he añadido una opción de menú contextual para anular la selección, lo cual es bastante duro:¿Cómo deseleccionar todos los elementos seleccionados en una vista de árbol de WPF al hacer clic en algún área vacía?
// 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;
Por otra parte, esto es contrario a la intuición, ya que requiere que el usuario haga clic derecho primero, y segundo, después de deseleccionarlo de esta manera, el usuario no puede seleccionarlo más haciendo clic en el elemento. ¿Cómo se supone que esto funcione?
Editar: Un poco más información: He añadido un controlador a la TreeView
para manejar eventos de clic del ratón, pero el remitente es siempre una instancia TreeView
, incluso si hago clic directamente sobre una TreeViewItem
. Si agrego un controlador a mi TreeView.ItemTemplate
(es decir, el primer elemento secundario de la plantilla), nunca obtengo eventos cuando hago clic en el área vacía (lo cual es bastante lógico). El código es el siguiente:
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");
}
}
Y el XAML para esto es:
<TreeView x:Name="MyTreeView" Margin="3" MouseUp="MyTreeView_MouseUp">
No funciona, porque después de seleccionar un elemento, el remitente está vinculado al elemento seleccionado actualmente, es decir, incluso si hago clic en el área vacía, el remitente == el elemento seleccionado actualmente. – Anteru
Hmm. Si hace clic en TreeView, el remitente debería ser un TreeView (no TreeViewItem). ¿Agregaste este controlador al TreeView o a cada TreeViewItem? ¿Estás usando el TreeView estándar o uno personalizado? – Pwninstein
Ahh el problema es que no obtengo un TreeViewItem, sino una instancia de mi clase viewmodel, para la cual tengo que encontrar el TreeViewItem correspondiente. Peor aún, después de deseleccionar un elemento mediante programación, no puedo volver a seleccionar haciendo clic en él. – Anteru