Pregunta

Tengo un ListView unión a un ItemsSource. ¿Por qué es el evento SelectionChanged disparando sobre los acontecimientos de carga / enlace de datos? Asumo que es porque una artículos 'por defecto' es decir, el índice 0 se selecciona.

¿Cómo puedo desactivar esto, porque la hora de seleccionar un elemento actualizado con otras fuentes de datos.

Gracias Petrus

¿Fue útil?

Solución 2

Gracias por las respuestas.

Cuando pongo un punto de interrupción en el evento SelectionChanged, se rompe el procedimiento allí antes de la pantalla está completamente cargado. También verá que la primera fila está 'seleccionado' después en la lista. No estoy unión a un SelectedIndexValue como se puede ver en el código. El DataContext de la lista es una ReadOnlyCollection

En mi caso SelectionChanged como se puede ver que notificar a otros objetos para ser cargado con los datos relacionados con el elemento seleccionado. Sólo quiero que esto suceda cuando uno se selecciona pero no una predeterminada que se creará. Tengo que de estos listviews que representan datos similares, pero en ninguno cargado debe tener un elemento seleccionado.

Me he dado cuenta de que el índice seleccionado por defecto se establece en -1 en la ventana de propiedades de la vista de lista. Incluso puede establecer este código es el caso List_Loaded, pero para entonces el primer SelectionChanged ha ocurrido ya.

<ListView PreviewMouseDown="ActiveCasesView_MouseDown" x:Name="ActiveCasesView"
                     DataContext="{StaticResource ActiveCasesViewSource}"
                     ItemsSource="{Binding}"
                     ItemTemplate="{StaticResource CasesItemTemplate}"
                     SelectionMode="Single"
                     SelectionChanged="ActiveCasesView_SelectionChanged"
                     ScrollViewer.CanContentScroll="True" 
                     ScrollViewer.VerticalScrollBarVisibility="Auto" >
</ListView>

private void ActiveCasesView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (mouseClicked)
            if (e.AddedItems.Count > 0)
                App.Messenger.NotifyColleagues(App.MSG_SELECT_ACTIVE_CASE, ((CaseViewModel)ActiveCasesView.SelectedItem).CaseNumber);
    }

He añadido el PreviewMouseDown para establecer un indicador que he hecho clic en la vista de lista en caso SelectionChanged. Esto ayuda, pero no estoy convencido de que es la mejor solución.

Gracias Petrus

Otros consejos

La vista de lista no se debe disparar el SelectionChange si sólo se establece la propiedad ItemsSource. Sin embargo, si enlaza la propiedad SelectedIndex en una propiedad de sus DataContext objetar la selección se moverá al índice especificado por la propiedad binded.

esto no desencadena el evento Selector_OnSelectionChanged cuando se carga la página:

<ListView SelectionChanged="Selector_OnSelectionChanged" 
                  ItemsSource="{Binding Path=Items}"
                  ></ListView>

pero esto hace:

<ListView SelectionChanged="Selector_OnSelectionChanged" 
                  SelectedIndex="{Binding Path=SelectedIndexValue}"
                  ItemsSource="{Binding Path=Items}"
                  ></ListView>

porque el SelectedIndex se establece en la SelecteIndexValue través de la unión.

Para evitar esto y aún así mantener los enlaces en su conjunto de marcas del SelectedIndexValue de su objeto DataContext a -1 antes del enlace (Antes de InitializeComponent () se llama en su forma constructor).

Espero que esto ayude.

No sé si todavía necesita ayuda con esto, pero he resuelto este problema haciendo una variable que sigue el selectedIndex, en mi caso - cuando se une inicialmente es siempre 0, así que es un poco más fácil para mí hacer Sin embargo, si usted le informa al modelo de vista del índice apropiado, simplemente agregué a

ComboBox box = e.OriginalSource as ComboBox;
if (_previousIndex == cb.SelectedIndex) return;
//do stuff you need to do with a new SelectedIndex

Puede intenta establecer la propiedad SelectedIndex a -1 en su unión, pero esto tampoco es una solución elegante.

<ListView PreviewMouseDown="ActiveCasesView_MouseDown" x:Name="ActiveCasesView"
                     DataContext="{StaticResource ActiveCasesViewSource}"
                     ItemsSource="{Binding}"
                     ItemTemplate="{StaticResource CasesItemTemplate}"
                     SelectionMode="Single"
                     SelectionChanged="ActiveCasesView_SelectionChanged"
                     ScrollViewer.CanContentScroll="True" 
                     ScrollViewer.VerticalScrollBarVisibility="Auto" 
**SelectedIndex="-1"**>
</ListView>

He intentado reproducir su comportamiento, pero sin éxito. ¿Cuál es el tipo de la colección ItemsSource que desee realizar la vinculación?

Puede utilizar la ventana evento cargado de bloquear la acción

bool loaded = false;

window.Loaded += new RoutedEventHandler(MainWindow_Loaded);

void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
   windowLoaded = true;
}

private void ActiveCasesView_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{

if(!loaded)
return ;

//do actions here ....

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top