/// <summary> /// SelectedItemProperty property changed handler. /// </summary> /// <param name="d">DataGrid that changed its SelectedItem.</param> /// <param name="e">DependencyPropertyChangedEventArgs.</param> private static void OnSelectedItemPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { DataGrid dataGrid = (DataGrid)d; if (!dataGrid.AreHandlersSuspended()) { int rowIndex = (e.NewValue == null) ? -1 : dataGrid.DataConnection.IndexOf(e.NewValue); if (rowIndex == -1) { // If the Item is null or it's not found, clear the Selection if (!dataGrid.CommitEdit(DataGridEditingUnit.Row, true /*exitEditing*/)) { // Edited value couldn't be committed or aborted d.SetValueNoCallback(e.Property, e.OldValue); return; } // Clear all row selections dataGrid.ClearRowSelection(true /*resetAnchorSlot*/); } else { dataGrid.SetValueNoCallback(DataGrid.SelectedIndexProperty, rowIndex); int slot = dataGrid.SlotFromRowIndex(rowIndex); if (slot != dataGrid.CurrentSlot) { if (!dataGrid.CommitEdit(DataGridEditingUnit.Row, true /*exitEditing*/)) { // Edited value couldn't be committed or aborted d.SetValueNoCallback(e.Property, e.OldValue); return; } if (slot >= dataGrid.SlotCount || slot < -1) { if (dataGrid.DataConnection.CollectionView != null) { dataGrid.DataConnection.CollectionView.MoveCurrentToPosition(rowIndex); } } } int oldCurrentSlot = dataGrid.CurrentSlot; try { dataGrid._noSelectionChangeCount++; int columnIndex = dataGrid.CurrentColumnIndex; if (columnIndex == -1) { columnIndex = dataGrid.FirstDisplayedNonFillerColumnIndex; } if (dataGrid.IsSlotOutOfSelectionBounds(slot)) { dataGrid.ClearRowSelection(slot /*slotException*/, true /*resetAnchorSlot*/); return; } dataGrid.UpdateSelectionAndCurrency(columnIndex, slot, DataGridSelectionAction.SelectCurrent, false /*scrollIntoView*/); } finally { dataGrid.NoSelectionChangeCount--; } if (!dataGrid._successfullyUpdatedSelection) { dataGrid.SetValueNoCallback(DataGrid.SelectedIndexProperty, oldCurrentSlot); d.SetValueNoCallback(e.Property, e.OldValue); } } } }
/// <summary> /// SelectedIndexProperty property changed handler. /// </summary> /// <param name="d">DataGrid that changed its SelectedIndex.</param> /// <param name="e">DependencyPropertyChangedEventArgs.</param> private static void OnSelectedIndexPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { DataGrid dataGrid = (DataGrid)d; if (!dataGrid.AreHandlersSuspended()) { int index = (int)e.NewValue; // GetDataItem returns null if index is >= Count, we do not check newValue // against Count here to avoid enumerating through an Enumerable twice // Setting SelectedItem coerces the finally value of the SelectedIndex object newSelectedItem = (index < 0) ? null : dataGrid.DataConnection.GetDataItem(index); dataGrid.SelectedItem = newSelectedItem; if (dataGrid.SelectedItem != newSelectedItem) { d.SetValueNoCallback(e.Property, e.OldValue); } } }