C# 在datagrid单元格上启动超链接事件处理程序单击

C# 在datagrid单元格上启动超链接事件处理程序单击,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,我有一个WPF数据网格,它有一些列。其中之一是DataGridHyperlinkColumn Datagrid的SelectedItem事件附加到我的视图模型的属性。此属性称为MySelectedItem 选中行的任何单元格时,将触发属性设置程序。Setter启动一个后台工作人员来做一些事情 此外,此属性将从视图模型更新,以便将更改传播到视图 我遇到的问题是DataGridHyperlinkColumn。我在超链接上附加了一个事件处理程序,该超链接弹出一个带有消息的自定义wpf窗口。问题出现在这

我有一个WPF数据网格,它有一些列。其中之一是DataGridHyperlinkColumn

Datagrid的SelectedItem事件附加到我的视图模型的属性。此属性称为MySelectedItem

选中行的任何单元格时,将触发属性设置程序。Setter启动一个后台工作人员来做一些事情

此外,此属性将从视图模型更新,以便将更改传播到视图

我遇到的问题是DataGridHyperlinkColumn。我在超链接上附加了一个事件处理程序,该超链接弹出一个带有消息的自定义wpf窗口。问题出现在这里:当我单击超链接并且之前未选择该行时,将触发datagrid selecteditem事件,而不是附加到超链接的事件处理程序。附加到超链接的事件处理程序仅在先前选中该行时才会被激发

我想要的行为是:

  • 如果我点击单元格超链接,后台工作人员不应该 已启动,我的意思是,附加到datagrid selectedItem事件的事件应该 不要被解雇。在这种情况下,只应激发超链接事件处理程序。此外,不应将datagrid行标记为选中
  • 否则,如果单击与超链接不同的datagrid单元格,则 应激发datagrid selectedItem事件(最后一种情况是 工作没有问题)
查看

<Window x:Class="DataGridExample.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" 
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <my:DataGrid x:Name="MyDataGrid" 
              SelectedItem="{Binding Path=MySelectedItem}"
              ItemsSource="{Binding Path=MyListOfItems}"               
              AutoGenerateColumns="False">
        <my:DataGrid.Columns>
           <my:DataGridHyperlinkColumn Header="LinkColumn" 
               Binding="{Binding myExtraData.LinkName}" 
               ContentBinding="{Binding myExtraData.LinkValue}">
               <my:DataGridHyperlinkColumn.ElementStyle>
                 <Style TargetType="TextBlock">
                    <EventSetter Event="Hyperlink.Click" Handler="OnCellHyperlinkClick" />
                 </Style>
               </my:DataGridHyperlinkColumn.ElementStyle>
           </my:DataGridHyperlinkColumn>
        </my:DataGrid.Columns>
    </my:DataGrid>
</Grid>
</Window>

您可以处理
PreviewMouseLeftButtonDown
事件,而不是处理
超链接。单击
事件:

<my:DataGridHyperlinkColumn.ElementStyle>
    <Style TargetType="TextBlock">
        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="OnCellHyperlinkClick" />
    </Style>
</my:DataGridHyperlinkColumn.ElementStyle>
<my:DataGridHyperlinkColumn.ElementStyle>
    <Style TargetType="TextBlock">
        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="OnCellHyperlinkClick" />
    </Style>
</my:DataGridHyperlinkColumn.ElementStyle>
private void OnCellHyperlinkClick(object sender, RoutedEventArgs e)
{
    e.Handled = true;

    //handle the event as before
}