我希望能够让用户编辑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>
下拉列表显示正确。该字段可以编辑任何文本,但是在关闭下拉列表后为自由文本设置null值到SelectedInstrument。它仅适用于所选项目。我尝试更改为SelectedValueBinding,但没有帮助。
如何正确实现这些要求?有人可以在这里发布一个可工作的示例吗?
附加: Orders是ObservableCollection Order具有像string Title,DateTime Ordered,string SelectedInstrument这样的属性, Instruments是一个string[]
解决方案: 以下建议来自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>
<DataGridComboBoxColumn>
替换为<DataGridTemplateColumn>
。 - Neil