如何将按钮添加到数据网格的最后一个/新行?

时间:2016-12-25 11:51:26

标签: c# wpf xaml datagrid

我想通过在datagrid的最后一行添加一个按钮来显示一个弹出窗口,以帮助用户向数据网格添加新行。我想我必须为DataGridTemplateColumn模板设置某种newrow/addrow属性?

2 个答案:

答案 0 :(得分:1)

您可以做的是将“DataGridRow”的样式编写为

这是工作的例子

<Style x:Type="DataGridRow">
<Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridRow}">
                    <Grid Background="{TemplateBinding Background}">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="auto"/>
                        </Grid.ColumnDefinitions>
                        <ContentPresenter Grid.Column="0" />
                        <Button Visibility = "{Binding IsLastRow}"/>!--can set converter to convert boolean to visibilty as well.
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
</Style>

所以绑定属性基本上检查最后一行的逻辑。(我不确定wpf datagrid本身是否提供某种类型的属性,如“IsLastRow”。但如果不是,任何时候你都可以编写自己的逻辑)。< / p>

在ContentTemplate中,您可以定义按钮处理程序或命令对象。

答案 1 :(得分:0)

您可以将DataGridRow样式与数据触发器一起使用,以更改最后一行的模板:

<DataGrid x:Name="dgrid">
    <DataGrid.Resources>
        <Style TargetType="{x:Type DataGridRow}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding}" Value="{x:Static CollectionView.NewItemPlaceholder}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type DataGridRow}">
                                <Border x:Name="DGR_Border" BorderBrush="{TemplateBinding BorderBrush}"
                                                BorderThickness="{TemplateBinding BorderThickness}" 
                                                Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                                    <Grid>
                                        <SelectiveScrollingGrid>
                                            <SelectiveScrollingGrid.ColumnDefinitions>
                                                <ColumnDefinition Width="Auto"/>
                                                <ColumnDefinition Width="*"/>
                                            </SelectiveScrollingGrid.ColumnDefinitions>
                                            <SelectiveScrollingGrid.RowDefinitions>
                                                <RowDefinition Height="*"/>
                                                <RowDefinition Height="Auto"/>
                                            </SelectiveScrollingGrid.RowDefinitions>
                                            <DataGridCellsPresenter Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                            <DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Visibility="{TemplateBinding DetailsVisibility}"/>
                                            <DataGridRowHeader Grid.RowSpan="2" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                        </SelectiveScrollingGrid>
                                        <Button Content="Add New" />
                                    </Grid>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
</DataGrid>

或者 - 如果要将Button放在特定列中 - 可以将DataGridTemplateColumn与使用类似数据触发器的CellTemplate一起使用:

<DataGrid x:Name="dgrid">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock>...</TextBlock>
                        <Button x:Name="btn" Content="Add" Visibility="Collapsed" />
                    </Grid>
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Path=DataContext, RelativeSource={RelativeSource AncestorType=DataGridRow}}"
                                             Value="{x:Static CollectionView.NewItemPlaceholder}">
                            <Setter TargetName="btn" Property="Visibility" Value="Visible" />
                        </DataTrigger>
                    </DataTemplate.Triggers>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>