2010-08-19 2 views
17

Sto utilizzando Wpf Toolkit DataGrid. Ogni volta che assegno Itemssource ad esso, il suo primo elemento viene selezionato e viene chiamato l'evento selectionChanged. Come posso smettere di selezionare una riga per impostazione predefinita?Arresta Datagrid selezionando la prima riga per impostazione predefinita

+1

Hai provato impostando la proprietà 'SelectedIndex' a -1 prima/dopo l'impostazione della' ItemSource'? –

risposta

30

Controllare se è stato impostato IsSynchronizedWithCurrentItem="True" e si richiede che sia impostato allo stesso modo?

<DataGrid IsSynchronizedWithCurrentItem="True" ... 

Con questa proprietà impostata su true, la selezione del primo elemento è il comportamento predefinito.

+0

Questo post mi ha salvato, grazie. – McAden

+2

Ho avuto la domanda opposta: volevo un modo per * make * seleziona la prima riga per impostazione predefinita. Questa risposta funziona ancora. – dlf

10

È probabile che il vostro DataGrid sia associato a una raccolta come PagedCollectionView che abbia una proprietà CurrentItem. Questa proprietà è auto-sincronizzata con la riga selezionata, in entrambe le direzioni. La soluzione sarebbe quella di impostare il CurrentItem su null. È possibile farlo in questo modo:

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

Ciò è particolarmente utile in Silverlight, che non ha DataGrid.IsSynchronizedWithCurrentItem proprietà ...

+1

+1 Ho trascorso un lungo periodo stumped da questo problema, e questa era la soluzione. :) –

+0

Questa dovrebbe essere la risposta quando è necessario mantenere la sincronizzazione tra CollectionViewSource e View. –

0

ho provato un certo numero di cose diverse, ma che cosa ha funzionato per me era per catturare il primo evento di selezione e "annullarlo" deselezionando tutto sul datagrid.

Ecco il codice per fare questo lavoro, spero che sia utile a qualcun altro :)

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

risposta di HCL è corretto, ma per i lettori a tira e molla, come me, si è rivelato fonte di confusione e ho finito passare ancora un po 'di tempo a cercare informazioni su altre cose prima di tornare qui e leggere attentamente.

<DataGrid IsSynchronizedWithCurrentItem="False" ... 

È il bit che ci interessa, non il suo antagonista!

Per aggiungere un valore personale: la proprietà IsSynchronizedWithCurrentItem=True significa che la griglia CurrentItem verrà sincronizzata con l'elemento corrente della raccolta. L'impostazione IsSynchronizedWithCurrentItem=False è ciò che vogliamo qui.

Per gli utenti Datagrid di Xceed (come ero in questo caso), che sarà SynchronizeCurrent=False