2010-08-19 7 views
17

Ich verwende Wpf Toolkit DataGrid. Immer wenn ich Itemsource zuweisen, wird das erste Element ausgewählt und das selectionChanged-Ereignis wird aufgerufen. Wie kann ich verhindern, dass standardmäßig eine Zeile ausgewählt wird?Stop Datagrid erste Zeile standardmäßig auswählen

+1

Haben Sie die 'SelectedIndex' Eigenschaft auf -1 vor/nach dem Einstellen der' ItemSource' Einstellung versuchen sein? –

Antwort

30

Überprüfen Sie, ob Sie IsSynchronizedWithCurrentItem="True" eingestellt haben und Sie möchten, dass sie gleich eingestellt sind?

<DataGrid IsSynchronizedWithCurrentItem="True" ... 

Wenn diese Eigenschaft auf true gesetzt ist, ist die Auswahl des ersten Elements das Standardverhalten.

+0

Dieser Beitrag hat mich gerettet, danke. – McAden

+2

Ich hatte die gegenteilige Frage - ich wollte einen Weg zu * machen * es standardmäßig die erste Zeile auswählen. Diese Antwort funktioniert immer noch. – dlf

10

Wahrscheinlich ist Ihr DataGrid an eine Sammlung wie PagedCollectionView gebunden, die über eine CurrentItem-Eigenschaft verfügt. Diese Eigenschaft wird automatisch mit der ausgewählten Zeile in beide Richtungen synchronisiert. Die Lösung wäre, CurrentItem auf null zu setzen. Sie können es wie folgt tun:

PagedCollectionView pcv = new PagedCollectionView(collection); 
pcv.MoveCurrentTo(null); 
dataGrid.ItemsSource = pcv; 

Das in Silverlight besonders hilfreich ist, die keine DataGrid.IsSynchronizedWithCurrentItem Eigenschaft hat ...

+1

+1 Ich verbrachte eine lange Zeit mit diesem Problem, und das war die Lösung. :) –

+0

Dies sollte die Antwort sein, wenn Sie die Synchronisierung zwischen der CollectionViewSource und der Ansicht beibehalten müssen. –

0

Ich habe versucht, eine Reihe von verschiedenen Dingen, aber was für mich gearbeitet wurde um das erste Auswahlereignis zu erfassen und rückgängig zu machen, indem alle auf dem Datagrid deaktiviert werden.

Hier ist der Code, um diese Arbeit zu machen, ich hoffe, es jemand anderem vorteilhaft ist :)

/* Add this inside your window constructor */ 
this.myDataGrid.SelectionChanged += myDataGrid_SelectionChanged; 

/* Add a private boolean variable for saving the suppression flag */ 
private bool _myDataGrid_suppressed_flag = false; 

/* Add the selection changed event handler */ 
void myDataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    /* I check the sender type just in case */ 
    if (sender is System.Windows.Controls.DataGrid) 
    { 
     System.Windows.Controls.DataGrid _dg = (System.Windows.Controls.DataGrid)sender; 

     /* If the current item is null, this is the initial selection event */ 
     if (_dg.CurrentItem == null) 
     { 
       if (!_myDataGrid_suppressed_flag) 
       { 
        /* Set your suppressed flat */ 
        _dgRateList_suppressed_flag = true; 
        /* Unselect all */ 
        /* This will trigger another changed event where CurrentItem == null */ 
        _dg.UnselectAll(); 

        e.Handled = true; 
        return; 
       } 
     } 
     else 
     { 
       /* This is a legitimate selection changed due to user interaction */ 
     } 
    } 
} 
0

Antwort der HCL ist richtig, aber für die schnelle und lose Leser wie mich, es erwies sich als verwirrend und ich landete verbringe noch etwas Zeit damit, andere Dinge zu erforschen, bevor du hierher zurückkommst und aufmerksam liest.

Ist das Bit, das wir interessieren, nicht sein Antagonist!

Um einen Wert von mir hinzuzufügen: die Eigenschaft IsSynchronizedWithCurrentItem=True bedeutet, dass das Gitter CurrentItem mit dem aktuellen Artikel der Sammlung synchronisiert wird. Einstellung IsSynchronizedWithCurrentItem=False ist, was wir hier wollen.

Für Datengitter des Xceed (wie ich in diesem Fall war), wird feststellen, dass SynchronizeCurrent=False

Verwandte Themen