Как бы я раскрыл раздел деталей Datagrid от нажатия кнопки? - PullRequest
3 голосов
/ 13 апреля 2009

Я пытаюсь реализовать сетку данных, которая работает как дерево папок (то есть каждая строка представляет папку, а представление сведений - еще одна сетка данных, показывающая файлы в папке). Я попытался урезать свой код для простоты, чтобы не было ошибок, но вот мой основной макет XAML:

<my:DataGrid Name="dataGrid1" AutoGenerateColumns="False" ItemsSource="{Binding}">
    <my:DataGrid.RowDetailsTemplate>
        <DataTemplate>
            <my:DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type my:DataGrid}}, Path=SelectedItem.Files}" AutoGenerateColumns="False" HeadersVisibility="None">
                <my:DataGrid.Columns>
                    <my:DataGridTextColumn Binding="{Binding Path=FileName}" />
                    <my:DataGridTextColumn Binding="{Binding Path=FSize}" />
                </my:DataGrid.Columns>
            </my:DataGrid>
        </DataTemplate>
    </my:DataGrid.RowDetailsTemplate>
    <my:DataGrid.Columns>
        <my:DataGridTemplateColumn CanUserResize="False" CanUserSort="False" Width="16">
            <my:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Button Click="Button_Click_1">
                        <Image Source="resources/+.ico" />
                    </Button>
                </DataTemplate>
            </my:DataGridTemplateColumn.CellTemplate>
        </my:DataGridTemplateColumn>
        <my:DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" />
    </my:DataGrid.Columns>
</my:DataGrid>

Я пытаюсь заставить кнопку развернуть строку сведений, но я не знаю, как ссылаться на строку:

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        // how do I reference a row here?
        DataGridRow row = ?
        // so I can do this:
        if (row.DetailsVisibility == Visibility.Collapsed)
            row.DetailsVisibility = Visibility.Visible;
        else
            row.DetailsVisibility = Visibility.Collapsed;
    }

Надеюсь, вопрос ясен ... Спасибо.

1 Ответ

6 голосов
/ 05 июня 2009
    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        DependencyObject obj = (DependencyObject)e.OriginalSource;
        while (!(obj is DataGridRow) && obj != null)
            obj = VisualTreeHelper.GetParent(obj);

        if(obj is DataGridRow)
            (obj as DataGridRow).DetailsVisibility = Visibility.Visible;
    }

... et voilà

...