如何在向 DataGrid 添加新行时更改 DataTemplate(仅适用于新行)

How do I change the DataTemplate while adding a new row to a DataGrid (for the new row only)

我需要显示一个 DataGrid,它隐藏了一些敏感信息,直到用户主动请求它。我这样构建了列:

<DataGrid.Columns>
<DataGridTextColumn Header="User Name" Binding="{Binding UserName}" IsReadOnly="False" MinWidth="90"/>
<DataGridTemplateColumn Header="Password" IsReadOnly="False" MinWidth="90">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Button Content="Show"                                              
        Command="{Binding Path=DataContext.ShowPassword, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
        CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridCheckBoxColumn Header="Owner Only" Binding="{Binding OwnerOnly}" IsReadOnly="{Binding IsOwner, Converter={StaticResource InverseBooleanConverter}}" MinWidth="90"/>
<DataGridCheckBoxColumn Header="Active" Binding="{Binding Active}" IsReadOnly="False" MinWidth="90"/>
<DataGridTextColumn Header="Created" Binding="{Binding Created, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" IsReadOnly="True" MinWidth="90"/>
<DataGridTextColumn Header="Superseded" Binding="{Binding Superseded, StringFormat=\{0:dd.MM.yyyy HH:mm\}}" IsReadOnly="True" MinWidth="90"/>

产生这个:

当用户单击“显示”按钮时,他们会看到另一个视图,该视图审核访问并允许他们更改密码。

我唯一的问题是我想让他们添加新行。当他们这样做时,他们无法指定密码,因为该列是按钮而不是文本字段。

问题:是否可以将 'new row' 上的按钮更改为文本框?

环境:MVVM,代码隐藏文件中没有任何内容。如果那是唯一的方法,我不介意在代码后面放一些东西。

谢谢

解决方案

已接受的答案满足了我 90% 的需求,但我不得不添加第二个数据触发器...

<ContentControl>
    <ContentControl.Resources>
        <Button x:Key="btn" Content="Show"                                              
Command="{Binding Path=DataContext.ShowPassword, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"/>
    </ContentControl.Resources>
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Setter Property="Content" Value="{StaticResource btn}" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Password}" Value="{x:Null}">
                        <Setter Property="Content">
                            <Setter.Value>
                                <TextBox />
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding DataContext, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="{x:Static CollectionView.NewItemPlaceholder}">
                        <Setter Property="Content">
                            <Setter.Value>
                                <TextBox />
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
    </ContentControl.Style>
</ContentControl>

您可以使用绑定到父级 DataContextContentControl,如果它是 NewItemPlaceholder,则显示 TextBox。像这样:

<DataGridTemplateColumn Header="Password" IsReadOnly="False" MinWidth="90">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <ContentControl>
                <ContentControl.Resources>
                    <Button x:Key="btn" Content="Show"                                              
                                        Command="{Binding Path=DataContext.ShowPassword, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                                        CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"/>
                </ContentControl.Resources>
                <ContentControl.Style>
                    <Style TargetType="ContentControl">
                        <Setter Property="Content" Value="{StaticResource btn}" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding DataContext, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="{x:Static CollectionView.NewItemPlaceholder}">
                                <Setter Property="Content">
                                    <Setter.Value>
                                        <TextBox />
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>