2013-02-26 88 views
3

我想知道如何防止在DataGrid中显示详细信息行,当有人点击单元格内的超链接或按钮时。当你尝试点击超链接和细节显示而不是链接时,真的很烦人。防止单击超链接时显示详细信息

另一个问题是,我在一列中有一些操作按钮,所以当细节被折叠时,您必须先点击行来显示细节,然后点击例如编辑按钮。

样品:

MainWindow.xaml.cs

namespace WpfApplication1 
{ 
    public class Item 
    { 
     public string Column0 { get; set; } 
     public string Mail { get; set; } 
    } 

    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      DataContext = this; 
     } 

     public ObservableCollection<Item> Items 
     { 
      get 
      { 
       ObservableCollection<Item> i = new ObservableCollection<Item>(); 
       i.Add(new Item() { Column0 = "dsaads", Mail = "[email protected]" }); 
       i.Add(new Item() { Column0 = "wdads", Mail = "[email protected]" }); 
       return i; 
      } 
     } 

     public void HyperlinkClick(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show("Clicked"); 
     } 
    } 
} 

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <DataGrid RowDetailsVisibilityMode="VisibleWhenSelected" ItemsSource="{Binding Items}" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Column0" Binding="{Binding Column0}" /> 
       <DataGridHyperlinkColumn Header="Mail" Width="*" Binding="{Binding Mail}" > 
        <DataGridHyperlinkColumn.ElementStyle> 
         <Style TargetType="TextBlock"> 
          <Setter Property="Padding" Value="2,0,2,0" /> 
          <EventSetter Event="Hyperlink.Click" Handler="HyperlinkClick" /> 
         </Style> 
        </DataGridHyperlinkColumn.ElementStyle> 
       </DataGridHyperlinkColumn> 
      </DataGrid.Columns> 

      <DataGrid.RowDetailsTemplate> 
       <DataTemplate> 
        <Grid Height="100"> 

        </Grid> 
       </DataTemplate> 
      </DataGrid.RowDetailsTemplate> 
     </DataGrid> 
    </Grid> 
</Window> 

要看到问题:选择第一行,然后试着点击超链接在第二行。

+1

如果你想更好的帮助,速度更快;总是提供代码:) – christopher 2013-02-26 13:13:24

+0

由于蕴含和“datagrid”是多余的,因为它已经在标签之中,所以没有必要在问题标题中既不添加“如何”或“数据网格”,因为“如何”是冗余的。 – Default 2013-02-26 13:14:11

+0

朋友,你很难得到这个问题的答案。提供一些代码和一些你已经尝试过的东西。 – 2013-02-26 13:15:41

回答

2

您可以在超链接“OnPreviewMouseDown”上处理隧道事件,这将阻止事件到达显示RowDetailsTemplate的DataGrid。

private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e) 
     { 
      var hyperlink = (Hyperlink)sender; 
     Process.Start(hyperlink.NavigateUri.AbsoluteUri); 
     e.Handled = true; 
     } 

完整的例子:

<Window x:Class="DummyTree.DataGridTest" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DataGridTest" Height="300" Width="300"> 
    <Grid> 
     <DataGrid ItemsSource="{Binding Customers}"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="First Name"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock> 
           <Hyperlink PreviewMouseDown="OnPreviewMouseDown" NavigateUri="http://www.google.com"> 
            <TextBlock Text="{Binding Name}" /> 
           </Hyperlink> 
          </TextBlock> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
      <DataGrid.RowDetailsTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock Text="{Binding Name}" /> 
         <TextBlock Text=" details here" /> 
        </StackPanel> 
       </DataTemplate> 
      </DataGrid.RowDetailsTemplate> 
     </DataGrid> 
    </Grid> 
</Window> 

代码背后:

using System.Collections.ObjectModel; 
using System.Windows; 
using System.Windows.Input; 

namespace DummyTree 
{ 
    public partial class DataGridTest : Window 
    { 
     public DataGridTest() 
     { 
      DataContext = new CustomerVM(); 
      InitializeComponent(); 
     } 

     private void OnPreviewMouseDown(object sender, MouseButtonEventArgs e) 
     { 
      var hyperlink = (Hyperlink)sender; 
     Process.Start(hyperlink.NavigateUri.AbsoluteUri); 
     e.Handled = true; 
     } 
    } 

    public class CustomerVM 
    { 
     public ObservableCollection<Customer> Customers { get; set; } 
     public CustomerVM() 
     { 
      Customers = new ObservableCollection<Customer> { new Customer { Name = "Leo" }, new Customer { Name = "Om" } }; 
     } 
    } 

    public class Customer 
    { 
     public string Name { get; set; } 
    } 
} 
+0

谢谢,这就是我需要的:-)。 – 2013-02-26 13:57:07

+1

请在上面的代码示例中查看更新的事件处理程序 – Shrinand 2013-02-26 14:07:24