c# - WPF Listbox elimina la selección haciendo clic en un espacio en blanco
listview binding c# (4)
Tengo un listbox
wpf con una plantilla de elemento personalizado que contiene un rectángulo. Se puede seleccionar cada elemento en el listbox
(solo uno a la vez). Quiero agregar un comportamiento en el que cuando un usuario hace clic en un lugar que no es el elemento (por ejemplo, un lugar en blanco en el listbox
, que no es un elemento), el elemento seleccionado se deseleccionará.
¿Algunas ideas? Gracias.
Por ejemplo, con un simple cuadro de lista: elemento 1 elemento 2
El comportamiento que estoy buscando es cuando el usuario hace clic en el píxel 500 (que es una parte del listbox
de listbox
pero no en un elemento), el elemento seleccionado actualmente se deseleccionará.
Para The each item in the listbox can be selected (only one at a time).
Puedes inventar uno de los siguientes
1- Deshabilitar el elemento después de que se selecciona.
2- Mantenga una lista en el backend para marcar cada índice seleccionable o no seleccionable.
Para asegurarse de que solo se selecciona un elemento, coloque esto en el cuadro de lista:
SelectionMode="Single"
luego, para deseleccionar al hacer clic en algún lugar, puedes intentar verificar estos eventos
PreviewMouseLeftButtonUp
LostFocus()
Saludos,
Intenta asegurar que el color de fondo de tu ListBox sea ''Transparente''
La solución simple es enlazar datos de una propiedad a la propiedad ListBox.SelectedItem
y establecerla como null
siempre que desee borrar la selección:
<ListBox ItemsSource="{Binding YourItems}" SelectedItem="{Binding SelectedItem}"
SelectionMode="Single" />
Luego, en el código, puede hacer esto para borrar la selección:
SelectedItem = null;
¿Y cuándo harías eso? Puede adjuntar un controlador al evento PreviewMouseLeftButtonDown
de la Window
o cualquier otro control en su UI. En el método del controlador, podría hacer una prueba de acierto para ver en qué fue el elemento en el que el usuario hizo clic:
HitTestResult hitTestResult =
VisualTreeHelper.HitTest(controlClickedOn, e.GetPosition(controlClickedOn));
Control controlUnderMouse = hitTestResult.VisualHit.GetParentOfType<Control>();
Consulte el VisualTreeHelper.HitTest Method (Visual, Point)
para obtener más ayuda con esta parte.
Entonces tal vez algo como esto:
if (controlUnderMouse.GetType() != typeof(ListBoxItem)) SelectedItem = null;
Por supuesto, hay muchas formas de hacerlo, y deberá completar los pocos espacios en blanco que deje, pero debe entenderse.
EDITAR >>>
El método genérico GetParentOfType
es un Método de extensión personalizado que se define en una clase separada llamada DependencyObjectExtensions
:
public static class DependencyObjectExtensions
{
public static T GetParentOfType<T>(this DependencyObject element)
where T : DependencyObject
{
Type type = typeof(T);
if (element == null) return null;
DependencyObject parent = VisualTreeHelper.GetParent(element);
if (parent == null && ((FrameworkElement)element).Parent is DependencyObject)
parent = ((FrameworkElement)element).Parent;
if (parent == null) return null;
else if (parent.GetType() == type || parent.GetType().IsSubclassOf(type))
return parent as T;
return GetParentOfType<T>(parent);
}
...
}