2010-03-17 70 views
11

我有一個DataGrid誰的RowDetails設置選擇(RowDetailsVisibilityMode =「VisibleWhenSelected」)時顯示。現在我想能夠擺脫它!我把該行的細節關閉按鈕使用此代碼:WPF DataGrid中隱藏RowDetails或取消行

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

試穿RowDetailsVisibilityChanged事件添加row.DetailsVisibility = Visibility.Visible;

1

嘗試使用設置按鈕的Command,CommandParameter屬性的Setter在按鈕上設置樣式。你需要創建一個類來實現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您的其他DataGrid中,並且也不太事件處理。

您可以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 2013-02-08 01:34:25

+1

-1儘管這可能是合法的代碼,它是利用WpfToolkit的這可能與不兼容OP的問題 – MickyD 2014-03-17 06:39:50

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

試試這個(添加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; 
       } 
      } 
     } 
    } 
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; 
}