Вы можете определить базовый тип столбца с помощью событий MouseMove
или PreviewMouseMove
следующим образом:
private void DataGrid_OnPreviewMouseMove(object sender, MouseEventArgs e)
{
var dataGrid = (DataGrid)sender;
var inputElement = dataGrid.InputHitTest(e.GetPosition(dataGrid)); // Get the element under mouse pointer
var cell = ((Visual)inputElement).GetAncestorOfType<DataGridCell>(); // Get the parent DataGridCell element
if (cell == null)
return; // Only interested in cells
var column = cell.Column; // Simple...
if (column is DataGridComboBoxColumn comboColumn)
; // This is a combo box column
}
Вы заметите, что я использую интересное расширение здесь. Это источник:
/// <summary>
/// Returns a first ancestor of the provided type.
/// </summary>
public static Visual GetAncestorOfType(this Visual element, Type type)
{
if (element == null)
return null;
if (type == null)
throw new ArgumentException(nameof(type));
(element as FrameworkElement)?.ApplyTemplate();
if (!(VisualTreeHelper.GetParent(element) is Visual parent))
return null;
return type.IsInstanceOfType(parent) ? parent : GetAncestorOfType(parent, type);
}
/// <summary>
/// Returns a first ancestor of the provided type.
/// </summary>
public static T GetAncestorOfType<T>(this Visual element)
where T : Visual => GetAncestorOfType(element, typeof(T)) as T;
Это один из многих подходов для получения элемента родитель / предок из визуального дерева, я все время использую его для таких задач, как та, с которой вы сталкиваетесь.
Вы обнаружите, что метод InputHitTest
и указанное выше расширение являются бесценными активами в ваших процедурах перетаскивания.