Вам нужно будет стилизовать элемент управления DataGrid
, так как быстрый Google не предлагает метод, позволяющий просто стилизовать "заполнитель нового элемента"
Для получения справки по этому вопросу вы должны проверить этот учебник (всего четыре статьи, и все они очень информативны)
В небольшом демонстрационном приложении, которое я написал в качестве тестовой площадки для этого вопроса, я создал новый UserControl
, унаследованный от класса DataGrid
, чтобы я мог расширить некоторые функции.
В этот класс я добавил два новых свойства NewItemTemplate
и IsAddingNewItem
- IsAddingNewItem имеет значение true, если вы выбрали, что хотите добавить новый элемент, и NewItemTemplate отображается только тогда, когда это свойство имеет значение true.
Ниже приведена очень простая схема стиля для этого: ( примечание : для экономии места это только схема; этот код фактически не компилируется)
<Style TargetType="{x:Type controls:DataGrid}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type controls:DataGrid}">
<Border>
<ScrollViewer Name="DG_ScrollViewer">
<ScrollViewer.Template>
<ControlTemplate TargetType="{x:Type ScrollViewer}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<!--Left Column Header Corner -->
<Button Command="{x:Static controls:DataGrid.SelectAllCommand}" />
<!--Column Headers-->
<Primitives:DataGridColumnHeadersPresenter Grid.Column="1" Name="PART_ColumnHeadersPresenter" />
<!--New Item Placeholder-->
<ContentPresenter Grid.Column="1" Grid.Row="1" Content="{Binding Path=NewItemInstance, RelativeSource={RelativeSource AncestorType={x:Type controls:DataGrid}}}" ContentTemplate="{Binding Path=NewItemTemplate, RelativeSource={RelativeSource AncestorType={x:Type controls:DataGrid}}}" Visibility="{Binding Path=IsAddingItem, Converter={StaticResource booleanToVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type controls:DataGrid}}}" />
<!--DataGrid content-->
<ScrollContentPresenter x:Name="PART_ScrollContentPresenter" Grid.Row="2" Grid.ColumnSpan="2" CanContentScroll="{TemplateBinding CanContentScroll}" />
<ScrollBar Grid.Row="0" Grid.RowSpan="4" Grid.Column="2" Name="PART_VerticalScrollBar" Orientation="Vertical" />
<ToggleButton IsChecked="{Binding Path=IsAddingItem, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, RelativeSource={RelativeSource AncestorType={x:Type controls:DataGrid}}}" Content="Add Item" Grid.Row="3" />
<Grid Grid.Row="4" Grid.Column="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type controls:DataGrid}}, Path=NonFrozenColumnsViewportHorizontalOffset}"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ScrollBar Grid.Column="1" Name="PART_HorizontalScrollBar" />
</Grid>
</Grid>
</ControlTemplate>
</ScrollViewer.Template>
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
</ScrollViewer>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Две части в этом примере, на которых вы должны сосредоточиться, это ContentPresenter
под комментарием "<!--New Item Placeholder-->
" и кнопка Toggle на несколько строк ниже.
Это стилизует DataGrid
так, чтобы оно отображалось в 4 строках: «Заголовки столбцов», «Заполнитель нового элемента», «Строки DataGrid» и «Кнопка добавления нового элемента» - все они окружены полосами прокрутки.
Затем, при использовании этого элемента управления (вам нужно будет использовать пользовательский элемент управления, такой как <controls:DataGrid ... />
и установить свойство NewItemTemplate
, как в вашем примере (вы также сможете использовать этот шаблон в шаблоне RowDetails для редактирование отдельных элементов для обеспечения единого внешнего вида).
Надеюсь, это поможет.