【问题标题】:I need the Expand / Collapse for RowDetailsTemplate我需要 RowDetailsTemplate 的展开/折叠
【发布时间】:2011-04-19 06:03:27
【问题描述】:

我有一个DataGrid。它有DataGrid.RowDetailsTemplate。单击按钮时,它应该展开/折叠;我该怎么做?

<Custom:DataGrid RowDetailsVisibilityMode="VisibleWhenSelected" SelectionMode="Extended" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" CanUserSortColumns="False">
    <Custom:DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <Custom:DataGrid>
                <Custom:DataGrid.Columns>
                    <Custom:DataGridTextColumn Binding="{Binding idClient, Mode=Default}" Header="Ид" IsReadOnly="True"/>
                    <Custom:DataGridTextColumn Binding="{Binding name_client, Mode=Default}"  Header="Имя" IsReadOnly="True"/>
                </Custom:DataGrid.Columns>
            </Custom:DataGrid>
        </DataTemplate>
    </Custom:DataGrid.RowDetailsTemplate>
    <Custom:DataGrid.Columns>
        <Custom:DataGridTemplateColumn>
            <Custom:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Expander IsExpanded="True"/>
                </DataTemplate>
            </Custom:DataGridTemplateColumn.CellTemplate>
        </Custom:DataGridTemplateColumn>
        <Custom:DataGridTextColumn Binding="{Binding idPartner, Mode=Default}" Header="Ид" IsReadOnly="True"/>
        <Custom:DataGridTextColumn Binding="{Binding name_partner, Mode=Default}"  Header="Имя" IsReadOnly="True"/>
    </Custom:DataGrid.Columns>
</Custom:DataGrid>

【问题讨论】:

    标签: wpf button datagrid expander


    【解决方案1】:

    在网格上选择一行应使用 RowDetailsTemplate 展开该行以显示内容。这使得该行成为选定行并设置 DataGrid 的 SelectedIndex 属性的值。

    要折叠行,请将 DataGrid 的 SelectedIndex 属性设置为 -1。

    【讨论】:

      【解决方案2】:

      包括折叠和展开的事件,如下所示

         <Custom:DataGridTemplateColumn>
         <Custom:DataGridTemplateColumn.CellTemplate>
                  <DataTemplate>
                      <Expander Collapsed="exp_Collapsed" Expanded="exp_Expanded"/>
                  </DataTemplate>
              </Custom:DataGridTemplateColumn.CellTemplate>
          </Custom:DataGridTemplateColumn>
      

      在后面的代码中

       private void exp_Collapsed(object sender, RoutedEventArgs e)
              {
                  this.dataGrid1.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.Collapsed;
              }
      
              private void exp_Expanded(object sender, RoutedEventArgs e)
              {
                  this.dataGrid1.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected;
              }
      

      【讨论】:

      • 选择一行的行为会打开它。通过调用 collapse 将折叠所有行,无论该行是否被选中。
      【解决方案3】:

      检查这个...

      Adding a Button to a WPF DataGrid

      XAML:

      <DataGrid Name="dg1" AutoGenerateColumns="False" SelectionMode="Single" CanUserAddRows="false" CanUserDeleteRows="False" SelectionUnit="FullRow" >
          <DataGrid.CellStyle>
              <Style TargetType="DataGridCell">
                  <Setter Property="BorderThickness" Value="0"/>
              </Style>
          </DataGrid.CellStyle>
      
          <DataGrid.RowHeaderTemplate>
              <DataTemplate>
                  <Expander Expanded="Expander_Expanded" Collapsed="Expander_Collapsed">
      
                  </Expander>
              </DataTemplate>
          </DataGrid.RowHeaderTemplate>
      
          <DataGrid.Columns>
              <DataGridTextColumn Header="Name" IsReadOnly="True" Width="100" Binding="{Binding Name}" />
              <DataGridTextColumn Header="Title" IsReadOnly="True" Width="100" Binding="{Binding Title}" />
              <DataGridTextColumn Header="Job" IsReadOnly="True" Width="100" Binding="{Binding Job}" />
          </DataGrid.Columns>
      
          <DataGrid.RowDetailsTemplate>
              <DataTemplate>
                  <TextBlock Text="{Binding Isi, Converter={StaticResource ResourceKey=isiTextConverter}}" Margin="10,5,0,0" />
              </DataTemplate>
          </DataGrid.RowDetailsTemplate>
      </DataGrid>
      

      MainWindow.xaml.cs

      private void Expander_Expanded(object sender, RoutedEventArgs e)
      {
          for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual)
          if (vis is DataGridRow)
          {
              var row = (DataGridRow)vis;
              row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
              break;
          }
      }
      
      private void Expander_Collapsed(object sender, RoutedEventArgs e)
      {
          for (var vis = sender as Visual; vis != null; vis = VisualTreeHelper.GetParent(vis) as Visual)
              if (vis is DataGridRow)
              {
                  var row = (DataGridRow)vis;
                  row.DetailsVisibility = row.DetailsVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
                  break;
              }
      }
      

      输出

      【讨论】:

      • 顺便说一句,Expander_ExpandedExpander_Collapsed 是相同的。如果有意,可以有一个方法来处理ExpandedCollapsed 事件
      • 我同意@ASh 的观点,也不必在树上工作......请参阅下面的答案,其中回答/更新了这些内容。
      • 此答案中缺少的是将数据网格的RowDetailsVisibilityMode 设置为DataGridRowDetailsVisibilityMode.Collapsed。否则,扩展器和数据网格都会扩展行。数据网格在任何行点击时都会这样做,而不仅仅是在点击扩展器时。
      【解决方案4】:

      我已经改进了之前的答案:

      使用 DataGridTemplateColumn 代替 DataGrid.RowHeaderTemplate 如下:

      <DataGridTemplateColumn>
         <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                      <Expander Expanded="Expander_OnExpanded"     Collapsed="Expander_OnCollapsed">
                      </Expander>
                 </DataTemplate>
         </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
      

      好处是您无需在单击扩展按钮后重新定位鼠标。

      【讨论】:

      • 不确定重新定位鼠标是什么意思。下面更新了答案。
      • @ΩmegaMan,我的意思是扩展按钮的位置没有改变,因此不需要上下移动鼠标指针来进一步点击扩展按钮。谢谢。
      【解决方案5】:

      不要遍历树来从扩展器中找到数据网格行,而是使用DataGridRow 上的静态方法GetRowContainingElement。如:

      private void Expander_Process(object sender, RoutedEventArgs e)
      {
          if (sender is Expander expander)
          {
              var row = DataGridRow.GetRowContainingElement(expander);
      
              row.DetailsVisibility = expander.IsExpanded ? Visibility.Visible 
                                                          : Visibility.Collapsed;
          }
      }
      

      那么扩展器对每个事件只有一个方法调用:

       <Expander Expanded="Expander_Process"  Collapsed="Expander_Process" />
      

      【讨论】:

        猜你喜欢
        • 2018-06-04
        • 2017-09-29
        • 2021-09-26
        • 2012-08-03
        • 2018-12-13
        • 2014-12-08
        • 2019-05-19
        • 2013-06-06
        • 2012-05-30
        相关资源
        最近更新 更多