我想让用户能够编辑 WPF DataGrid 中的一些数据(来自 .net Framework 4.0)。“仪器”列应允许用户从静态列表中选择可用仪器或编写自由文本。我的 DataGrid 使用 MVVM 绑定到数据。我尝试了很多我在互联网上找到的解决方案,但没有一个能正常工作。这是我的代码:
<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 订单具有字符串 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>