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

时间:2018-03-20 14:38:41

标签: c# wpf mvvm datagrid

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

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

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

此属性也从视图模型更新,因此更改将传播到视图。

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

我想要的行为是:

  • 如果我点击单元格超链接,后台工作者不应该 开始,我的意思是,事件附加到datagrid selectedItem事件应该 不被解雇。在这种情况下,只应触发超链接事件处理程序。数据网格行也不应标记为已选中。
  • 否则,如果我点击与超链接不同的数据网格单元格,则 应触发datagrid selectedItem事件(最后一种情况是 工作没有问题)。

查看

pdu

模型: MySelectedItem属性在下面的视图模型中的某些点内设置。 我不会在这里展示简化。

<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>

1 个答案:

答案 0 :(得分:1)

您可以处理PreviewMouseLeftButtonDown事件,而不是处理Hyperlink.Click事件:

<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
}