Как включить пользовательскую строку в конец DataGrid в Silverlight?

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

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

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

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

Мысли?

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

Обновить

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

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

c#,xaml,datagrid,silverlight-2.0,controltemplates,

10

Ответов: 3


5 принят

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

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

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

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

<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

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


2

Сначала создайте 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>

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

C #, XAML, DataGrid, Silverlight-2.0, controltemplates,
Похожие вопросы
Яндекс.Метрика