展开/折叠嵌套的WPF网格

时间:2012-06-01 12:28:49

标签: c# wpf wpfdatagrid

我创建了一个嵌套的WPF Datagrid。我看到你可以通过点击行来扩展它,但是当你做同样的事情时它不会崩溃。

几个问题:

  1. 用户如何折叠网格?
  2. 有没有办法在父行上获得展开/折叠按钮?
  3. 每当您单击其他父级进行展开时,它都会折叠您之前使用的父级。有没有办法让网格保持你的方式。即如果我展开第1行然后转到第3行,第1行将保留在我扩展到第3行的位置。
  4. 谢谢, 格雷格

2 个答案:

答案 0 :(得分:0)

使用WPF Expander。这样就可以扩展内部DataGrid。

答案 1 :(得分:0)

有几种方法可以达到这种行为。 例如 Expand/Collapse button in a Silverlight DataGrid

如果您更喜欢xaml,请使用:

<Style x:Key="ExpandableDataGridRowHeaderStyle"
           TargetType="sdk:DataGridRowHeader">
    <Setter Property="Background"
                Value="#99E9EEF4" />
    <Setter Property="IsTabStop"
                Value="False" />
    <Setter Property="SeparatorBrush"
                Value="#FFFFFFFF" />
    <Setter Property="SeparatorVisibility"
                Value="Collapsed" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="sdk:DataGridRowHeader">
                <Grid x:Name="Root">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="25" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>                           
                    <Border BorderBrush="#FFFFFFFF"
                                BorderThickness="1,0,1,0"
                                Grid.ColumnSpan="2"
                                Grid.RowSpan="3">
                        <Grid>
                            <Rectangle x:Name="RowInvalidVisualElement"
                                           Grid.ColumnSpan="2"
                                           Fill="#FFF7D8DB"
                                           Opacity="0"
                                           Grid.RowSpan="3"
                                           Stretch="Fill" />
                            <Rectangle x:Name="BackgroundRectangle"
                                           Grid.ColumnSpan="2"
                                           Fill="Transparent"
                                           Grid.RowSpan="3"
                                           Stretch="Fill" />
                        </Grid>
                    </Border>
                    <Button Background="{x:Null}"
                                BorderBrush="{x:Null}"
                                BorderThickness="0"
                                Padding="0"
                                Grid.RowSpan="1"
                                HorizontalAlignment="Stretch">
                        <i:Interaction.Triggers>
                            <i:EventTrigger EventName="Click">
                                <AttachedBehaviors:ExpandButtonAction/>
                            </i:EventTrigger>
                        </i:Interaction.Triggers>
                    </Button>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

AttachedBehavior实际上会改变DetailsVisibility

public class ExpandButtonAction : TargetedTriggerAction<FrameworkElement>
{
    #region Invoke

    protected override void Invoke(object parameter)
    {
        RoutedEventArgs eventArgs = (RoutedEventArgs) parameter;
        Button bsender = eventArgs.OriginalSource as Button;
        var row = DataGridRow.GetRowContainingElement(eventArgs.OriginalSource as FrameworkElement);
        if (row.DetailsVisibility == Visibility.Visible)
        {
            row.DetailsVisibility = Visibility.Collapsed;
        }
        else
        {
            row.DetailsVisibility = Visibility.Visible;
        }
    }

    #endregion
}

并将其应用于您要展开/展开RowHeaderStyle的{​​{1}} DataGrid