WPF DataGrid隐藏RowDetails或取消选择Row

Nat*_*ugg 11 wpf wpfdatagrid

我有一个DataGrid,其RowDetails设置为在选中时显示(RowDetailsVisibilityMode ="VisibleWhenSelected").现在我希望能够摆脱它!我用这段代码在行细节上放了一个关闭按钮:

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;
  }
Run Code Online (Sandbox Code Playgroud)

该代码在那里得到了90%,但是一旦给定行的行细节折叠,下次选择该行时就不会出现.

Law*_*ley 13

我也遇到过这种情况.这是一个解决方案:

将该按钮保留在RowDetails中并稍微更改其代码.不要关注单个行的可见性,而是将DataGrid的SelectedIndex属性设置为-1(未选中).

DataGrid1.SelectedIndex = -1;
Run Code Online (Sandbox Code Playgroud)

由于您的RowDetailsVisibilityMode是VisibleWhenSelected,DataGrid将折叠/隐藏任何展开的RowDetails.当SelectionMode为时,这很有效Single.


小智 6

您可以使用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>
Run Code Online (Sandbox Code Playgroud)

请参阅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;
            }
        }                
    }
Run Code Online (Sandbox Code Playgroud)

这对我很有用.