WPF DataGrid隐藏RowDetails或取消选择Row

时间:2010-03-17 23:08:52

标签: 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;
  }

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

7 个答案:

答案 0 :(得分:12)

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

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

DataGrid1.SelectedIndex = -1;

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

答案 1 :(得分: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>

请参阅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;
            }
        }                
    }

这对我很有用。

答案 2 :(得分: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;
            }
        }

答案 3 :(得分:1)

尝试在row.DetailsVisibility = Visibility.Visible;事件上添加RowDetailsVisibilityChanged

答案 4 :(得分:1)

尝试使用设置Button的Command,CommandParameter属性的Setter在Button上设置样式。您需要创建一个支持ICommand的类,并将其作为XAML中的StaticResource包含在内。在这里,我使用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重新用于其他DataGrids,并减少事件处理。

您可以在this Silverlight-to-WPF DataGrid开源项目中看到一个工作示例。

答案 5 :(得分:0)

试试这个(在XAML中将PreviewMouseDown事件添加到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;
                }
            }
        }
    }

答案 6 :(得分: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;
}