I am having a conflict between two features that I want in my DataGrid. The definition of the DataGrid is as follows:
<DataGrid x:Name="dgSalesOrders" IsReadOnly="True" SelectionMode="Single" SelectionUnit="FullRow" PreviewMouseLeftButtonDown="dgSalesOrders_PreviewMouseLeftButtonDown">
<DataGrid.Columns>
<DataGridHyperlinkColumn Header="Order #" Binding="{Binding SalesOrderNumber}" IsReadOnly="True">
<DataGridHyperlinkColumn.ElementStyle>
<Style TargetType="TextBlock">
<EventSetter Event="Hyperlink.Click" Handler="colOrderNumber_Click"/>
</Style>
</DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>
</DataGrid.Columns>
</DataGrid>
dgSalesOrders_PreviewMouseLeftButtonDown
is as follows:
private void dgSalesOrders_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
prevRowIndex = getDataGridItemCurrentRowIndex(e.GetPosition, dgSalesOrders);
if (prevRowIndex < 0 || dgSalesOrders.SelectedItems.Count == 0)
return;
dgSalesOrders.SelectedIndex = prevRowIndex;
List<SalesOrder> selectedOrders = new List<SalesOrder>();
foreach (ThinSalesOrder salesOrder in dgSalesOrders.SelectedItems)
selectedOrders.Add(salesOrder);
ThinSalesOrder selectedOrder = (ThinSalesOrder)dgSalesOrders.Items[prevRowIndex];
if (selectedOrder == null)
return;
DataObject data = new DataObject(salesOrdersFormat, selectedOrders.ToArray());
if (DragDrop.DoDragDrop(dgSalesOrders, data, DragDropEffects.Move) != DragDropEffects.None)
dgSalesOrders.SelectedItem = selectedOrder;
}//dgSalesOrders_PreviewMouseLeftButtonDown
My issue is that the hyperlink click event (colOrderNumber_Click
) does not fire if DragDrop.DoDragDrop(dgSalesOrders, data, DragDropEffects.Move)
is called.
Is there some way that this method squashes the click event? If e.Handled
is not being set to true, why does colOrderNumber_Click
not fire?
Your problems are partly because DoDragDrop is synchronous.
http://www.csharp411.com/dodragdrop-is-synchronous/
Whilst you're drag dropping then that's all you're doing.
You should also avoid accidentally starting drag by checking the amount they moved the mouse after preview mouse down.
Mixing the two pieces of functionality in one control doesn't seem like a good idea.
I suggest you give them another column or row header they use for dragging.