2010-03-17 2 views
11

У меня есть DataGrid, у которого RowDetails устанавливается, когда он выбран (RowDetailsVisibilityMode = "VisibleWhenSelected"). Теперь я хочу избавиться от него! Я поставил кнопку закрытия на деталях строки с этим кодом:WPF DataGrid Hide RowDetails или Unselect Row

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

попробуйте добавить row.DetailsVisibility = Visibility.Visible; на мероприятие RowDetailsVisibilityChanged.

1

Попробуйте установить стиль на кнопке с помощью Setters, которые задают параметры Button Command, CommandParameter. Вам нужно создать свой класс, который использует 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 для других DataGrids, а также уменьшить обработку событий.

Вы можете увидеть рабочий пример в проекте с открытым исходным кодом 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

+1

-1 несмотря на то, что может быть легитимным код, он делает использование WpfToolkit, которые могут быть несовместимы с Вопрос OP – MickyD

3

вы можете поместить это как событие нажатия кнопок, оно поднимается, дерево находит datarow и задает детали там, где это необходимо.

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 к вашему DataGrid в 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; 
       } 
      } 
     } 
    } 
0

Убедитесь, что ваш DataGrid имеет имя, такое как

<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; 
} 
Смежные вопросы