12

I have a DataGrid who's RowDetails is set to show when selected (RowDetailsVisibilityMode="VisibleWhenSelected"). Now I want to be able to get rid of it! I put a close button on the row details with this code:

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

That code gets me 90% there, but once the row details is collapsed for a given row it will not appear the next time that row is selected.

4

7 に答える 7

14

I've run into this too. Here's a solution:

Keep that button in the RowDetails and change its code a little. Rather than focusing on the individual row's visibility, set the DataGrid's SelectedIndex property to -1 (none selected).

DataGrid1.SelectedIndex = -1;

Since your RowDetailsVisibilityMode is VisibleWhenSelected, the DataGrid will collapse/hide any expanded RowDetails. This works well when the SelectionMode is Single.

于 2010-06-10T14:05:27.940 に答える
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;
            }
        }                
    }

これは私にとって非常にうまくいきました。

于 2010-09-01T23:58:52.493 に答える
3

you can put this as your buttons click event, it walks up the tree finds the datarow and sets the details where needed.

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;
            }
        }
于 2011-03-21T03:48:28.033 に答える
1

try adding row.DetailsVisibility = Visibility.Visible; on the RowDetailsVisibilityChanged event.

于 2010-04-22T17:07:14.250 に答える
1

Try setting a Style on the Button with Setters that set the Button's Command, CommandParameter properties. You'll need to create your a class that inplements ICommand and include it as a StaticResource in XAML. Here I used the DataGridRowHeader as a button instead of a button within row details.

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

In the command's Execute method you can get the DataGridRow from the command parameter and apply whatever methods you need to.

At least this way you can share this Style or base others off of it and re-use the ICommand for your other DataGrids, and also less event handling.

You can see a working example in this Silverlight-to-WPF DataGrid open-source project.

于 2010-06-24T21:44:36.047 に答える
0

Try this (adding the PreviewMouseDown event to your DataGrid in XAML):

 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;
                }
            }
        }
    }
于 2015-08-14T13:10:54.273 に答える
0

Make sure your datagrid has a name such as

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

Place a button in the row template such as

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

Then in the codebehind simply set the datagrid's selected index to -1

private void Button_Click(object sender, RoutedEventArgs e)
{
    dgPrimary.SelectedIndex = -1;
}
于 2017-07-07T17:46:04.883 に答える