2010-03-17 170 views
11

我有一个DataGrid谁的RowDetails设置选择(RowDetailsVisibilityMode =“VisibleWhenSelected”)时显示。现在我想能够摆脱它!我把该行的细节关闭按钮使用此代码:WPF DataGrid中隐藏RowDetails或取消行

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
    e.Handled = true; 
    Button button = sender as Button; 
    DataGridRow row = button.FindAncestor<DataGridRow>(); 

    row.DetailsVisibility = Visibility.Collapsed; 
    } 

这些代码让我90%有,但一旦该行的细节被折叠为给定的行不会选择该行的下一次出现。

回答

11

我也遇到过这个。这里有一个解决方案:

保持在RowDetails那个按钮,改变它的代码一点点。将DataGrid的SelectedIndex属性设置为-1(未选中),而不是关注单个行的可见性。

DataGrid1.SelectedIndex = -1; 

由于您的RowDetailsVisibilityMode是VisibleWhenSelected,DataGrid中就会崩溃/隐藏任何扩大RowDetails。当SelectionMode为Single时,此方法运行良好。

1

试穿RowDetailsVisibilityChanged事件添加row.DetailsVisibility = Visibility.Visible;

1

尝试使用设置按钮的Command,CommandParameter属性的Setter在按钮上设置样式。你需要创建一个类来实现ICommand,并将其作为StaticResource包含在XAML中。在这里,我使用DataGridRowHeader作为按钮,而不是行细节中的按钮。

 <local:DeselectRowCommand x:Key='deselectCommand' /> 
      <Setter Property='Command' Value='{StaticResource deselectCommand}' /> 
       <Setter Property='CommandParameter' 
    Value='{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
AncestorType=wpf:DataGridRow}}' /> 

在命令的Execute方法中,您可以从命令参数中获取DataGridRow并应用您需要的任何方法。

至少这样你可以分享这个风格或基地他人关闭它,并重新使用的ICommand您的其他DataGrid中,并且也不太事件处理。

您可以this Silverlight-to-WPF DataGrid开源项目看到工作的例子。

5

您可以在XAML下面的代码来实现这一点:

<WpfToolkit:DataGrid Name="dgSysthetic" ItemsSource="{Binding}" 
    AutoGenerateColumns="True"  
    SelectionMode="Extended" 
    RowDetailsVisibilityMode="Collapsed" 
    CanUserAddRows="False" CanUserDeleteRows="False" 
    CanUserResizeRows="False" CanUserSortColumns="False" 
    RowHeaderWidth="20" RowHeight="25"> 
    <WpfToolkit:DataGrid.RowHeaderTemplate> 
     <DataTemplate> 
      <Button Name="btnHideRow" Click="btnHideDetails_Click" FontSize="5">></Button> 
     </DataTemplate> 
    </WpfToolkit:DataGrid.RowHeaderTemplate> 
    <WpfToolkit:DataGrid.RowDetailsTemplate> 
     <DataTemplate> 
      <WpfToolkit:DataGrid Name="dgAnalytical" ItemsSource="{Binding}" AutoGenerateColumns="True"/>     
     </DataTemplate> 
    </WpfToolkit:DataGrid.RowDetailsTemplate>   
</WpfToolkit:DataGrid> 

见里面RowHeaderTemplate按钮。

在你的C#代码,你这样做:

private void btnHideDetails_Click(object sender, RoutedEventArgs e) 
    { 
     DependencyObject obj = (DependencyObject)e.OriginalSource; 
     while (!(obj is DataGridRow) && obj != null) obj = VisualTreeHelper.GetParent(obj); 

     if (obj is DataGridRow) 
     { 
      if ((obj as DataGridRow).DetailsVisibility == Visibility.Visible) 
      { 
       (obj as DataGridRow).DetailsVisibility = Visibility.Collapsed; 
      } 
      else 
      { 
       (obj as DataGridRow).DetailsVisibility = Visibility.Visible; 
      } 
     }     
    } 

这个工作对我非常好。

+0

完美...作品非常好 – manudea 2013-02-08 01:34:25

+1

-1尽管这可能是合法的代码,它是利用WpfToolkit的这可能与不兼容OP的问题 – MickyD 2014-03-17 06:39:50

3

你可以把这个作为你的按钮点击事件,它走了树找到数据行,并将在必要的细节。

DependencyObject dep = (DependencyObject)e.OriginalSource; 
     while ((dep != null) && !(dep is DataGridRow)) 
     { 
      dep = VisualTreeHelper.GetParent(dep); 
     } 
     if (dep != null && dep is DataGridRow) 
     { 
      DataGridRow row = dep as DataGridRow; 
      if (row.DetailsVisibility == Visibility.Collapsed) 
      { 
       row.DetailsVisibility = Visibility.Visible; 
      } 
      else 
      { 
       row.DetailsVisibility = Visibility.Collapsed; 
      } 
     } 
0

试试这个(添加PreviewMouseDown事件在XAML你的DataGrid中):

private void UIElement_OnPreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     DataGrid grid = sender as DataGrid; 

     if (grid != null) 
     { 
      FrameworkElement element = e.OriginalSource as FrameworkElement; 

      if (element?.DataContext is FixedIncomeOrder) 
      { 
       if (grid.SelectedItem == (FixedIncomeOrder) ((FrameworkElement) e.OriginalSource).DataContext) 
       { 
        grid.SelectedIndex = -1; 
        e.Handled = true; 
       } 
      } 
     } 
    } 
0

确保您的数据网格行中有作为

<DataGrid x:Name="dgPrimary" 
      ...> 

广场这样的名字按钮模板如

<DataGrid.RowDetailsTemplate> 
    <DataTemplate> 
     <Button Content="X" Click="Button_Click" Width="20"/> 
     .... 

那么在代码隐藏简单设置DataGrid的选择指数为-1

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    dgPrimary.SelectedIndex = -1; 
}