wpf - 如何在WPF DataGrid中实现可编辑的DataGridComboBoxColumn

标签 wpf binding datagrid datagridcomboboxcolumn

我想让用户能够编辑 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/

相关文章:

c# - WPF 使用 Magstrip 编码打印到打印机

.net - 从内存加载WPF应用程序

c# - 在 MouseDown 上显示 MessageBox 占用了 MouseUp 事件

Android 数据绑定(bind) : can't find setter for attribute android:onClick

binding - JRuby JSR223 接口(interface)忽略 binidngs

c# - 填充 DataGrid : how to manipulate data before showing it on C# MySQL

c# - 如何使用 2 个或更多模型?

Cocoa 绑定(bind)和应用程序首选项 - 崩溃

wpf - 用 Xceed 的 WPF DataGrid 中的图像替换复选框

c# - WPF Datagrid Double Click Cell MVVM设计