我想让用户能够编辑 WPF DataGrid 中的某些数据(来自 .net Framework 4.0)。 “仪器”列应允许用户从静态列表中选择可用仪器或编写自由文本。 我的 DataGrid 使用 MVVM 绑定(bind)到数据。我尝试了在互联网上找到的许多解决方案,但没有一个能够正常工作。 这是我的代码:
<DataGrid Margin="0,6" ItemsSource="{Binding Path=Orders}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="True">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="Instrument" MinWidth="140"
ItemsSource="{x:Static ViewModel.Instruments}" SelectedItemBinding="{Binding Path=SelectedInstrument}">
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="IsEditable" Value="True"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
下拉列表显示正确。该字段可以使用任何文本进行编辑,但在关闭自由文本的下拉列表后,它会将 SelectedInstrument 设置为空。它仅适用于所选项目。我尝试更改为 SelectedValueBinding,但没有帮助。
如何正确落实这一要求?有人可以在这里发布工作示例吗?
附加: 订单是 ObservableCollection Order 具有属性,如字符串 Title、DateTime Ordered、字符串 SelectedInstrument、 Instruments 是一个字符串[]
解决方案: 以下建议作为解决方法 bathineni作品:
<DataGrid Margin="0,6" ItemsSource="{Binding Path=Orders}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="True">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Instrument" MinWidth="140">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=SelectedInstrument, Mode=OneWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox IsEditable="True" Text="{Binding Path=SelectedInstrument}"
ItemsSource="{x:Static ViewModel.Instruments}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
最佳答案
发生这种情况是因为输入的自由文本是字符串类型,而您绑定(bind)到组合框的所选项目是某种复杂类型......
不要使用DataGridComboBoxColumn
,而是使用DataGridTemplateColumn
,并且您可以将组合框的Text
属性绑定(bind)到某个属性,该属性将在之后保存自由文本值关闭下拉列表。
通过查看以下示例,您可以得到更好的想法。
<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox IsEditable="True"
Text="{Binding NewItem}"
ItemsSource="{Binding Sourcelist.Files}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
关于wpf - 如何在WPF DataGrid中实现可编辑的DataGridComboBoxColumn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6899697/