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
risposta
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.
È 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 Ho trascorso un lungo periodo stumped da questo problema, e questa era la soluzione. :) –
Questa dovrebbe essere la risposta quando è necessario mantenere la sincronizzazione tra CollectionViewSource e View. –
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 */
}
}
}
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
Hai provato impostando la proprietà 'SelectedIndex' a -1 prima/dopo l'impostazione della' ItemSource'? –