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>
对于以下问题,我还没有真正找到合适的解决方案:当我在 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>