2009-09-02 12 views
10

Ich habe eine ListView Bindung an eine ItemsSource. Warum wird das Ereignis SelectionChanged auf den load/datengebundenen Ereignissen ausgelöst? Ich nehme an, dass dies daran liegt, dass ein 'default' Item, dh Index 0, ausgewählt ist.WPF ListView SelectionChanged Ereignis

Wie kann ich dies deaktivieren, weil bei der Auswahl eines Elements andere Quellen mit Daten aktualisiert.

Dank Petrus

+0

Hey Petrus. Könnten Sie bitte Ihren Code teilen? – Anvaka

Antwort

1

danke für die Antworten.

Wenn ich einen Breakpoint auf das SelectionChanged-Ereignis setze, unterbricht es dort den Prozess, bevor der Bildschirm vollständig geladen ist. Sie sehen auch, dass die erste Zeile danach in der Liste "ausgewählt" wird. Ich bin nicht an einen SelectedIndexValue gebunden, wie Sie im Code sehen können. Der DataContext für die Liste ist eine ReadonlyCollection

In meinem SelectionChanged-Ereignis, wie Sie sehen können, benachrichtige ich andere Objekte, die mit Daten geladen werden sollen, die sich auf das ausgewählte Element beziehen. Ich möchte nur, dass dies geschieht, wenn eine ausgewählt ist, aber keine Standardeinstellung. Ich habe von diesen ListViews, die ähnliche Daten darstellen, aber auf geladenen muss keines ein Element ausgewählt haben.

Ich habe festgestellt, dass der Standard-Selected-Index im Eigenschaftenfenster für die Listview auf -1 gesetzt ist. Ich kann sogar diesen Code auf dem List_Loaded-Ereignis setzen, aber bis dahin ist der erste SelectionChanged bereits passiert.

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

Ich habe die Preview einen Indikator zu setzen, dass ich auf der Listenansicht im Selection Ereignis geklickt haben. Das hilft, aber ich bin nicht davon überzeugt, dass es die beste Lösung ist.

Dank Petrus

4

Listenansicht sollte die Selection nicht ausgelöst, wenn Sie nur die Itemssource-Eigenschaft festgelegt. Wenn Sie jedoch die SelectedIndex-Eigenschaft an eine Eigenschaft Ihres dataContext-Objekts binden, wird die Auswahl zu dem Index verschoben, der durch die Eigenschaft binded angegeben wird.

diese feuert nicht die Selector_OnSelectionChanged Ereignis, wenn die Seite geladen wird:

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

aber dies tut:

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

weil die SelectedIndex auf die SelecteIndexValue durch Bindung eingestellt ist.

Um dies zu vermeiden und weiterhin die Bindungen in Ihrem Markup beizubehalten, setzen Sie den SelectedIndexValue Ihres dataContext-Objekts vor der Bindung auf -1 (Before InitializeComponent() wird in Ihrem Formularkonstruktor aufgerufen).

Hoffe, das hilft.

0

Sie können versuchen, die SelectedIndex-Eigenschaft auf -1 in der Bindung, aber das ist keine elegante Lösung auch zu setzen.

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

Ich habe versucht, Ihr Verhalten zu reproduzieren, aber ohne Erfolg. Welchen Typ der ItemsSource-Auflistung, an die Sie gebunden sind?

+0

Ich bin an eine ReadonlyCollection eines benutzerdefinierten ViewModel gebunden. – Petrus

0

Sie Fenster geladen Ereignis verwenden können, um die Aktion zu blockieren

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

In diesem Fall kann das erste Element nicht angewendet werden. –

1

Ich weiß nicht, ob Sie immer noch dabei helfen müssen, aber ich löste dieses Problem, indem eine Variable machen, die die selectedIndex-Spuren in meinem Fall - wenn anfänglich gebunden ist es immer 0, so ist es ein bisschen einfacher für mich zu tun, aber wenn Sie das Ansichtsmodell des entsprechenden Index informieren, fügte ich einfach einen

Verwandte Themen