studio - obtener el indice de un listview c#
No se pudieron obtener los elementos seleccionados correctamente si se configura ListView ItemsContainer como VirtualizationStackPanel (1)
Establecí ''VirtualizingStackPanel.IsVirtualizing'' en verdadero y ''VirtualizingStackPanel.VirtualizationMode'' en ''Reciclaje'', porque los elementos en mi ListView son demasiados. El modo de selección de ListView es extendido, la propiedad ''IsSelected'' del ListViewItem está vinculada a la propiedad ''IsSelected'' de mi modelo, el modo de vinculación es bidireccional.
Cuando quiero usar Ctrl + A para seleccionar todos los ítems, solo selecciono parte de los ítems, entonces uso KeyBinding para escribir el método select all como se muestra a continuación:
<KeyBinding Command="{Binding SelectAllCommand}"
Modifiers="Control"
Key="A"/>
El método Select Allll enlazará la colección ItemsSource y establecerá que cada propiedad de IsSelected del elemento sea verdadera. Pero también conduce a algo inesperado. Cuando se seleccionan todos los elementos, desplazo la barra de desplazamiento hacia abajo y se cargarán más elementos a ListView, hago un solo clic en un elemento y lo esperado es que todos los demás elementos no están seleccionados, solo seleccione este elemento. Pero parece que no se eliminan otros elementos.
¿Alguien puede ayudar?
Este comportamiento del Selector es de esperar, ya que solo puede funcionar con elementos de IU cargados. Debido a la virtualización de habilitación, ha cargado solo aquellos elementos que contienen en el área visible. Por lo tanto, Selector no "sabe" sobre los demás.
Para solucionar esto, debe hacerlo, ese Selector "sabe" sobre los elementos previamente seleccionados. En otras palabras, debe prohibir la descarga de cualquier elemento de UI que haya sido seleccionado.
Primero, cree su propio panel de virtualización con blackjack y prostitutas:
public class MyVirtualizingStackPanel : VirtualizingStackPanel
{
protected override void OnCleanUpVirtualizedItem(CleanUpVirtualizedItemEventArgs e)
{
var item = e.UIElement as ListBoxItem;
if (item != null && item.IsSelected)
{
e.Cancel = true;
e.Handled = true;
return;
}
var item2 = e.UIElement as TreeViewItem;
if (item2 != null && item2.IsSelected)
{
e.Cancel = true;
e.Handled = true;
return;
}
base.OnCleanUpVirtualizedItem(e);
}
}
A continuación, reemplace el panel predeterminado en ListBox, ListView, TreeView u otros controles de usuario que proporcionan el selector. Por ejemplo, a través del estilo:
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<blackjackandhookers:MyVirtualizingStackPanel/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
... o, directamente en tu selector:
<YourSelector.ItemsPanel>
<ItemsPanelTemplate>
<blackjackandhookers:MyVirtualizingStackPanel/>
</ItemsPanelTemplate>
</YourSelector.ItemsPanel>
¡Disfrutar!
Espero que mi respuesta te ayude