2009-09-02 21 views
10

J'ai une liaison ListView à ItemsSource. Pourquoi l'événement SelectionChanged déclenche-t-il les événements charge/databound? Je suppose que c'est parce qu'un élément 'par défaut' c'est-à-dire que l'index 0 est sélectionné.Événement WPF Listview SelectionChanged

Comment puis-je désactiver cela, car lors de la sélection d'un élément mis à jour d'autres sources avec des données.

Merci Petrus

+0

Hey Petrus. Pourriez-vous s'il vous plaît partager votre code? – Anvaka

Répondre

1

merci pour les réponses.

Lorsque je place un point d'arrêt sur l'événement SelectionChanged, il interrompt la procédure avant que l'écran ne soit complètement chargé. Vous verrez également que la première rangée est «sélectionnée» ensuite sur la liste. Je ne lie pas à SelectedIndexValue comme vous pouvez le voir dans le code. Le DataContext pour la liste est un ReadonlyCollection

Dans mon événement SelectionChanged comme vous pouvez le voir, j'avertis d'autres objets à charger avec des données relatives à l'élément sélectionné. Je veux seulement que cela se produise quand on est sélectionné mais pas par défaut. Je dois de ces ListViews représentant des données similaires mais sur chargé aucun doit avoir un élément sélectionné.

J'ai remarqué que l'index sélectionné par défaut est défini sur -1 dans la fenêtre de propriétés de la vue de liste. Je peux même définir ceci est le code sur l'événement List_Loaded, mais d'ici là le premier SelectionChanged est déjà arrivé.

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

J'ai ajouté le PreviewMouseDown pour définir un indicateur que j'ai cliqué sur le listview en cas SelectionChanged. Cela aide mais je ne suis pas convaincu que c'est la meilleure solution.

Merci Petrus

4

Le listView ne devrait pas tirer le SelectionChange si vous ne définissez la propriété ItemsSource. Toutefois, si vous liez la propriété SelectedIndex à une propriété de votre objet dataContext, la sélection sera déplacée vers l'index spécifié par la propriété liée.

cela ne pas déclenche l'événement Selector_OnSelectionChanged lorsque la page des charges:

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

mais cela ne:

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

parce que le SelectedIndex est réglé sur la SelecteIndexValue par liaison. Pour éviter cela et conserver les liaisons dans votre balisage, définissez SelectedIndexValue de votre objet dataContext sur -1 avant la liaison (Before InitializeComponent() est appelée dans votre constructeur de formulaire).

Espérons que cela aide.

0

Vous pouvez essayer de définir la propriété SelectedIndex à -1 dans votre liant mais c'est pas non plus une solution élégante.

<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> 

J'ai essayé de reproduire votre comportement mais sans succès. Quel est le type de la collection ItemsSource à laquelle vous liez?

+0

Je lie à un ReadonlyCollection d'un ViewModel personnalisé. – Petrus

0

vous pouvez utiliser l'événement chargé fenêtre pour bloquer l'action

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

Dans ce cas, le premier élément peut être inexécutable. –

1

Je ne sais pas si vous avez encore besoin d'aide, mais je résolu ce problème en faisant une variable qui suit le selectedIndex, dans mon cas - lorsqu'il est initialement lié, il est toujours 0 donc c'est un peu plus facile pour moi, mais si vous informez le modèle de l'index approprié, j'ai simplement ajouté un