Как добавить пользовательскую строку в конец DataGrid в Silverlight? - PullRequest
10 голосов
/ 04 февраля 2009

У меня есть DataGrid в моем приложении Silverlight, и оно прекрасно работает, добавляя строку или удаляя строку, когда я манипулирую коллекцией ItemsSource. Однако я хочу, чтобы была дополнительная строка или элемент управления, который всегда появляется после последней строки данных.

Я могу заставить дополнительный элемент управления появляться после последней строки, используя ControlTemplate и установив для строки RowsPresenter значение Авто высота, но это означает, что строки никогда не прокручиваются, когда область визуализации становится слишком маленькой. Однако, если я изменю высоту строки RowsPresenter на Звезду, строки будут прокручиваться, но дополнительный элемент управления будет прикреплен к нижней части сетки данных, а не к нижней части последней строки.

Есть ли способ, с помощью которого я могу настроить поведение высоты звезды на RowsPresenter, пока мой контроль отображается так, как я хочу?

В настоящее время я думаю, что мне нужно каким-то образом использовать событие LoadingRow, чтобы найти позицию последней строки, и использовать Canvas или аналогичное, чтобы разместить свой элемент управления в соответствующем месте.

Мысли

Заранее спасибо за помощь.

Обновление

Я также задал вопрос (и в конечном итоге ответил) о закреплении одного элемента управления под другим, который можно использовать для решения этой проблемы, если вы не хотите, чтобы пользовательская строка прокручивалась с остальными строками (например, в моем случай, когда я хотел, чтобы в другой строке заголовка таблицы данных отображались итоги и плавали над другими строками).

Как закрепить один элемент управления под другим в Silverlight?

Ответы [ 3 ]

6 голосов
/ 05 февраля 2009

Я решил мою проблему прошлой ночью в шоке от вдохновения. Я заметил, что никто не голосовал за этот вопрос, поэтому этот ответ может быть никому не полезен, но на всякий случай.

Прежде всего, я объединил свой пользовательский элемент управления строкой и RowsPresenter в сетке из двух строк, каждая из которых имеет размер Auto. Затем я поместил сетку в ScrollViewer, а затем изменил размер строки просмотра прокрутки до размера Star. Я не добавил часть шаблона VerticalScrollbar в свой шаблон, так как это только прокручивает RowsPresenter.

Это дало мне точное поведение, которое я искал, когда добавляется строка, а пользовательская строка остается закрепленной в нижней части последней строки данных. Когда строки и пользовательские строки выходят за пределы видимой области, появляется полоса прокрутки, позволяющая прокручивать, сохраняя фиксированные заголовки.

Работа выполнена. Я надеюсь, что кто-то найдет это полезным. Ниже мой ControlTemplate XAML.

<ControlTemplate TargetType="swcd:DataGrid" x:Key="DataGridTemplate">
    <Border
        BorderBrush="{TemplateBinding BorderBrush}"
        BorderThickness="{TemplateBinding BorderThickness}">

        <Grid Name="Root" Background="{TemplateBinding Background}">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <swcdp:DataGridColumnHeader Name="TopLeftCornerHeader" Grid.Column="0"/>
            <swcdp:DataGridColumnHeadersPresenter Name="ColumnHeadersPresenter" Grid.Column="1"/>
            <swcdp:DataGridColumnHeader Name="TopRightCornerHeader" Grid.Column="2"/>

            <ScrollViewer
                Grid.Row="1"
                Grid.Column="1"
                Grid.ColumnSpan="1"
                Padding="0,0,0,0"
                BorderThickness="0,0,0,0"
                VerticalScrollBarVisibility="Auto">
                <Grid >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>

                    <swcdp:DataGridRowsPresenter Name="RowsPresenter" Grid.Row="0" />

                    <Border
                        Margin="1,1,1,1"
                        Padding="2,2,2,2"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        Grid.Row="1">
                        <Grid Background="{TemplateBinding Background}">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>

                            <TextBlock
                                Grid.Row="0"
                                TextAlignment="Left"
                                TextWrapping="NoWrap"
                                Text="Add a new item using the lists below:" />

                            <mystuff:MySelectionControl
                                HorizontalContentAlignment="Stretch"
                                Grid.Row="1"
                                SelectionChanged="OnSelectionChanged"/>
                        </Grid>
                    </Border>
                </Grid>
            </ScrollViewer>

            <Rectangle Name="BottomLeftCorner" Grid.Row="3" Grid.ColumnSpan="2" />
            <Grid Grid.Column="1" Grid.Row="3">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Rectangle Name="FrozenColumnScrollBarSpacer" />
                <ScrollBar Name="HorizontalScrollbar" Grid.Column="1" Orientation="Horizontal" Height="18" />
            </Grid>
            <Rectangle Name="BottomRightCorner" Grid.Column="2" Grid.Row="3" />
        </Grid>
    </Border>
</ControlTemplate>
2 голосов
/ 14 декабря 2013

Сначала создайте Grid для DataGrid и закрепленного элемента управления:

<Grid Grid.Row="0" VerticalAlignment="Top">
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />               
        <RowDefinition Height="Auto" />            
    </Grid.RowDefinitions>

    <sdk:DataGrid Grid.Row="0" ItemsSource="{Binding YOUR_COLLECTION}" />

    <TextBlock Grid.Row="1" Text="Hello World" /> <!-- The pinned control. -->
</Grid>

Хитрость заключается в том, что VerticalAlignment = "Top" - когда DataGrid меньше доступной высоты, он переместится в верхнюю часть доступного пространства и закрепленный элемент появится под ним.

Затем поместите эту сетку в контейнер, который растягивается вертикально, например, в ряд другой сетки с высотой звезды:

<Grid x:Name="LayoutRoot">
    <Grid.RowDefinitions>
        <!-- RowDefition for the Grid with the DataGrid with the pinned control. --> 
        <!-- If you want to have some other controls, -->
        <!-- add other RowDefinitions and put these controls there.  -->
        <RowDefinition Height="*" /> 
    </Grid.RowDefinitions>

    <!-- The internal Grid for the DataGrid & the pinned control. -->
    <Grid Grid.Row="0" VerticalAlignment="Top">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />               
            <RowDefinition Height="Auto" />            
        </Grid.RowDefinitions>

        <sdk:DataGrid Grid.Row="0" ItemsSource="{Binding YOUR_COLLECTION}" />

        <TextBlock Grid.Row="1" Text="Hello World" /> <!-- The pinned control. -->
    </Grid>
</Grid>

Вместо корневой сетки у вас может быть любой другой контейнер, который растягивается по вертикали, важно то, что он пытается заполнить все доступное для него пространство.

2 голосов
/ 21 октября 2009

Не уверен, поможет ли это для Silverlight, но я добавил итоговую строку в WPF DataGrid, добавив невидимый столбец с именем IsTotal. Мне удалось заставить эту строку всегда появляться в нижней части сетки, используя пользовательские группировки / сортировку. Порядок группировки / сортировки был настроен для использования этого столбца в качестве основной сортировки с фиксированным направлением. Кажется, работает хорошо.

...