代码之家  ›  专栏  ›  技术社区  ›  Nate Zaugg

WPF数据报隐藏行详细信息或取消选择行

  •  11
  • Nate Zaugg  · 技术社区  · 14 年前

    我有一个数据报,它的rowdetails设置为选中时显示(rowdetailsVisibilityMode=“visiblewheeselected”)。现在我想摆脱它!我在行详细信息上放置了一个关闭按钮,其中包含以下代码:

    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 回复  |  直到 14 年前
        1
  •  12
  •   Lawrence P. Kelley    14 年前

    我也碰到过这个。以下是解决方案:

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

    DataGrid1.SelectedIndex = -1;
    

    因为rowdetailsVisibility模式是 VisibleWhenSelected 数据报将折叠/隐藏任何展开的行详细信息。当selectionmode为 Single .

        2
  •  6
  •   Nate Zaugg    8 年前

    您可以在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;
                }
            }                
        }
    

    这对我很管用。

        3
  •  3
  •   Burrito    13 年前

    你可以把它作为你的按钮点击事件,它走到树上找到数据行并在需要的地方设置细节。

    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;
                }
            }
    
        4
  •  1
  •   agf    13 年前

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

        5
  •  1
  •   T. Webster    13 年前

    尝试使用设置按钮命令commandParameter属性的setter在按钮上设置样式。您需要创建一个包含在元素ICommand中的类,并将其作为静态资源包含在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}}' />
    

    在命令的执行方法中,可以从命令参数中获取DataGridRow,并应用所需的任何方法。

    至少通过这种方式,您可以共享此样式或将其他样式从中分离出来,并为其他数据报重新使用ICommand,同时减少事件处理。

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

        6
  •  0
  •   Prethen    9 年前

    尝试此操作(将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;
                    }
                }
            }
        }
    
        7
  •  0
  •   ΩmegaMan    7 年前

    确保你的数据报有一个名字,比如

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

    在行模板中放置按钮,例如

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

    然后在codebehind中,只需将数据报的选定索引设置为-1

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