WPF:如何替换用于在 DataGridTextColumn 中编辑的 Datagrid 的文本框

WPF: How to replace the TextBox of Datagrid used for Editing in a DataGridTextColumn

对于以下问题,我还没有真正找到合适的解决方案:当我在 WPF/NetCore 中编辑 DataGrid 的某些列时,我想使用自定义的文本框或控件,我可以使用各种操作,如重复警告、显示相似条目或事件阻止重复完成等...

<DataGrid ItemsSource="{Binding lessonEntries}" AutoGenerateColumns="False" Grid.Column="0" Grid.Row="0" Margin="10" CanUserAddRows="True" CanUserDeleteRows="True" CanUserReorderColumns="False" CanUserSortColumns="True">

 <DataGrid.Columns>
        <DataGridTextColumn Header="{x:Static res:Strings.wndMainColNative}"    Binding="{Binding Native.Text}"  Width="*" />
        <DataGridTextColumn Header="{x:Static res:Strings.wndMainColForeign}"   Binding="{Binding Foreign.Text}" Width="*" />

        <!-- TEST -->
        <DataGridTemplateColumn Header="Test1" Width="*">
            <DataGridTemplateColumn.CellTemplate >
                <DataTemplate>
                    <TextBox Name="testBox" Text="{Binding Path=Foreign.Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></TextBox>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTextColumn Header="{x:Static res:Strings.wndMainColLvlSpeak}"  Binding="{Binding LevelSpeak.Level}"     IsReadOnly="False" />
        <DataGridTextColumn Header="{x:Static res:Strings.wndMainColWrite}"     Binding="{Binding LevelWrite.Level}"     IsReadOnly="False" />
        <DataGridTextColumn Header="{x:Static res:Strings.wndMainColListen}"    Binding="{Binding LevelListen.Level}"    IsReadOnly="False" />
    </DataGrid.Columns>

</DataGrid>

但是我找不到如何替换文本框。

最终我会将设置传递给自定义控件,例如允许的词、拒绝的词或现有词的列表,它会按照指定的方式运行。

我发现最接近的是使用 DataGridTemplateColumn,但它始终处于编辑模式,而我仅在编辑单元格时才需要它。

编辑:

有时解决方案就在那里,而您却看不到!感谢@Rekshino

实际上 TextBlock 是用于显示模式的控件,但解决方案是使用 DataGridTemplateColumn

<DataGridTemplateColumn Header="Test1" Width="*">
    <DataGridTemplateColumn.CellTemplate >
        <DataTemplate>
            <TextBlock Name="testBox" Text="{Binding Path=Foreign.Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <StackPanel >
                <ComboBox SelectedItem="{Binding Path=Foreign.Text}"/>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

你可以用DataGridTemplateColumn.CellEditingTemplate来做:

<DataGridTemplateColumn >
    <DataGridTemplateColumn Header="Test1" Width="*">
        <DataGridTemplateColumn.CellTemplate >
            <DataTemplate>
                <TextBox Name="testBox" Text="{Binding Path=Foreign.Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ></TextBox>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <StackPanel >
                <ComboBox ItemsSource="{StaticResource YourListOfWords}" SelectedItem="{Binding Path=Foreign.Text}"/>
            </StackPanel>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>