Frage

habe ich eine ListView zu einem ItemsSource Bindung. Warum feuert das SelectionChanged Ereignis auf den Lade- / Databound-Event? Ich gehe davon aus, dass es ist, weil ein ‚default‘ Elemente, dh Index 0 ausgewählt ist.

Wie kann ich dies zu deaktivieren, da bei der Auswahl eines Element aktualisiert andere Quellen mit Daten.

Danke Petrus

War es hilfreich?

Lösung 2

Danke für die Antworten.

Wenn ich einen Haltepunkt auf dem Selection Ereignis setzen, bricht es Verfahren gibt, bevor der Bildschirm voll geladen ist. Sie werden auch sehen, dass die erste Zeile danach auf der Liste ‚ausgewählt‘ wird. Ich bin nicht verbindlich auf eine SelectedIndexValue wie Sie im Code sehen können. Die Datacontext für die Liste ist eine Readonlycollection

In meinem Fall Selection wie man sehen kann ich andere Objekte benachrichtigen mit Daten geladen werden, um das ausgewählte Element beziehen. Ich will nur dies geschehen kann, wenn man gewählt ist aber kein Standard sein Set. Ich habe zu dieser Listviews ähnliche Daten, welche aber auf geladen keiner muss ein Element haben, ausgewählt.

Ich habe bemerkt, dass die Standard-Selected Index auf -1 auf dem Eigenschaftenfenster für die Listenansicht eingestellt ist. Ich kann sogar setzen Sie diesen Code auf der List_Loaded Ereignis ist, aber dann der erste Selection bereits geschehen ist.

<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. Dies tut Hilfe, aber ich bin nicht davon überzeugt, dass sie die beste Lösung.

Danke Petrus

Andere Tipps

Das Listview sollte nicht die Selection feuern, wenn Sie nur die Itemssource-Eigenschaft festgelegt. Allerdings, wenn Sie binden die SelectedIndex-Eigenschaft auf eine Eigenschaft des Datacontext die Auswahl Objekt wird auf den Index bewegen, die durch die Binded Eigenschaft angegeben wird.

das nicht löst das Selector_OnSelectionChanged Ereignis, wenn die Seite geladen wird:

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

, aber das bedeutet:

<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 immer noch die Bindungen in Ihrem Markup die SelectedIndexValue Ihres Datacontext-Objekts auf -1 gesetzt vor der Bindung (Vor InitializeComponent () in der Form Konstruktor aufgerufen wird).

Hope, das hilft.

Ich weiß nicht, ob Sie immer noch Hilfe brauchen, aber ich löste dieses Problem, indem eine Variable zu machen, dass Spuren der selectedIndex, in meinem Fall - wenn zunächst gebunden, es ist immer 0, so ist es ein wenig einfacher für mich zu tun aber wenn Sie das Ansichtsmodell des entsprechenden Index informieren, habe ich einfach ein

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

Sie können versuchen, die SelectedIndex Eigenschaft auf -1 gesetzt, in der Bindung, aber das ist auch nicht eine elegante Lösung.

<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. Was ist die Art der Itemssource-Sammlung, die Sie binden?

Sie können Fenster geladen Ereignis verwenden, 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 ....

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top