2009-09-02 31 views
10

Tengo un ListView vinculante a ItemsSource. ¿Por qué el evento SelectionChanged se activa en los eventos load/databound? Supongo que es porque se selecciona un elemento 'predeterminado', es decir, el índice 0.WPF Listview SelectionChanged evento

Cómo puedo desactivar esto, porque al seleccionar un elemento actualizado otras fuentes con datos.

Gracias Petrus

+0

Hey Petrus. ¿Podría compartir su código? – Anvaka

Respuesta

1

gracias por las respuestas.

Cuando coloco un punto de interrupción en el evento SelectionChanged, se interrumpe el proceso antes de que la pantalla esté completamente cargada. También verá que la primera fila se 'selecciona' luego en la lista. No estoy vinculando a SelectedIndexValue como puede ver en el código. El DataContext para la lista es ReadonlyCollection

En mi evento SelectionChanged como puede ver notifico que otros objetos se carguen con datos relacionados con el elemento seleccionado. Solo quiero que esto suceda cuando se selecciona uno, pero no uno predeterminado para establecer. Tengo que ver estas ListViews que representan datos similares, pero al cargar ninguno debe tener un elemento seleccionado.

He notado que el índice predeterminado seleccionado se establece en -1 en la ventana de propiedades para la vista de lista. Incluso puedo configurar este código en el evento List_Loaded, pero para entonces ya ha sucedido el primer SelectionChanged.

<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); 
    } 

que añade 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 sea la mejor solución.

Gracias Petrus

4

la vista de lista no deben disparar el SelectionChange si sólo se establece la propiedad ItemsSource. Sin embargo, si vincula la propiedad SelectedIndex a una propiedad de su objeto dataContext, 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:

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

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

Para evitar esto y aún mantener los enlaces en su marcado establezca el valor de SelectedIndexValue de su objeto dataContext en -1 antes del enlace (antes de invocar InitializeComponent() en su constructor de formulario).

Espero que esto ayude.

0

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 colección ItemsSource a la que se está vinculando?

+0

Estoy vinculando a un ReadonlyCollection de un ViewModel personalizado. – Petrus

0

puede utilizar la ventana cargado de eventos para 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 .... 

} 
+0

En ese caso, el primer elemento puede ser untappable. –

1

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 está inicialmente encuadernado siempre es 0, así que es un poco más fácil para mí, sin embargo, si informa el modelo de vista del índice apropiado, simplemente agregué un

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