XAML代码:

<Window x:Class="DGComboBoxDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DGComboBoxDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:DC_Main x:Key="DC"/>
    </Window.Resources>
    <DataGrid AutoGenerateColumns="False" CanUserAddRows="False" Name="dg" DataContext="{Binding Source={StaticResource DC}}" ItemsSource="{Binding UnitItems}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="名称" Binding="{Binding Name}" Width="100"/>
            <DataGridTextColumn Header="当前值" Binding="{Binding Step}" Width="80"/>
            <DataGridComboBoxColumn Header="选项" ItemsSource="{Binding StepItems}" DisplayMemberPath="Tip" SelectedValuePath="Step" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
</Window>

C#代码如下:

public partial class MainWindow : Window
        public MainWindow()
            InitializeComponent();
            var dc = dg.DataContext as DC_Main;
            var unit1 = new UnitItem { Name = "单元1", Step = 1 };
            unit1.StepItems.Add(new StepItem { Tip = "就绪", Step = 0 });
            unit1.StepItems.Add(new StepItem { Tip = "初始化", Step = 1 });
            var unit2 = new UnitItem { Name = "单元2", Step = 0 };
            unit2.StepItems.Add(new StepItem { Tip = "开始", Step = 0 });
            unit2.StepItems.Add(new StepItem { Tip = "结束", Step = 1 });
            dc.UnitItems.Add(unit1);
            dc.UnitItems.Add(unit2);
    public class StepItem
        public string Tip { get; set; }
        public ushort Step { get; set; }
    public class UnitItem
        public string Name { get; set; }
        public ushort Step { get; set; }
        public ObservableCollection<StepItem> StepItems { get; set; } = new ObservableCollection<StepItem>();
    public class DC_Main
        public ObservableCollection<UnitItem> UnitItems { get; set; } = new ObservableCollection<UnitItem>();

运行效果
点击选项列
运行软件发现第三列未显示为下拉列表,用户点击选项列对应内容,显示的下拉表为空,未能达到预定效果。通过网络搜索DataGridComboBoxColumn的相关示例,发现大部分ItemsSource为静态绑定,无法实现动态列表内容填充功能。

因无法使用原生的DataGridComboBoxColumn数据列项实现下拉列表功能,只好使用DataGridTemplateColumn+ComboBox组合方案实现此功能,最终运行效果如下。

运行效果
XAML代码

<Window x:Class="DGComboBoxDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DGComboBoxDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:DC_Main x:Key="DC"/>
    </Window.Resources>
    <DataGrid AutoGenerateColumns="False" CanUserAddRows="False" Name="dg" DataContext="{Binding Source={StaticResource DC}}" ItemsSource="{Binding UnitItems}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="名称" Binding="{Binding Name}" Width="100"/>
            <DataGridTextColumn Header="当前值" Binding="{Binding CurStep}" Width="80"/>
            <DataGridTemplateColumn Header="选项" Width="*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding StepItems}" DisplayMemberPath="Tip" SelectedValuePath="Step" SelectedValue="{Binding SelStep}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Window>

最终解决方案

通过不懈努力,终于将此问题解决!!!
XAML

<Window x:Class="DGComboBoxDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DGComboBoxDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:DC_Main x:Key="DC"/>
    </Window.Resources>
        <DataGrid AutoGenerateColumns="False" CanUserAddRows="False" Name="dg" DataContext="{Binding Source={StaticResource DC}}" ItemsSource="{Binding UnitItems}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="名称" Binding="{Binding Name}" Width="100"/>
                <DataGridTextColumn Header="选项1值" Binding="{Binding CurStep}" Width="80"/>
                <DataGridTemplateColumn Header="选项" Width="*">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{Binding StepItems1}" DisplayMemberPath="Tip" SelectedValuePath="Step" SelectedValue="{Binding CurStep, UpdateSourceTrigger=PropertyChanged}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            <DataGridTextColumn Header="选项2值" Binding="{Binding SelStep}" Width="80"/>
            <DataGridComboBoxColumn Header="选项2" Width="*" SelectedValueBinding="{Binding SelStep, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                    <DataGridComboBoxColumn.EditingElementStyle>
                        <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding StepItems2}"/>
                            <Setter Property="DisplayMemberPath" Value="Tip"/>
                            <Setter Property="SelectedValuePath" Value="Step"/>
                        </Style>
                    </DataGridComboBoxColumn.EditingElementStyle>
                    <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding StepItems2}"/>
                        <Setter Property="DisplayMemberPath" Value="Tip"/>
                        <Setter Property="SelectedValuePath" Value="Step"/>
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
                </DataGridComboBoxColumn>
            </DataGrid.Columns>
        </DataGrid>
</Window>
public partial class MainWindow : Window
        public MainWindow()
            InitializeComponent();
            var dc = dg.DataContext as DC_Main;
            var unit1 = new UnitItem { Name = "单元1", CurStep = 1 };
            unit1.StepItems1.Add(new StepItem { Tip = "就绪", Step = 0 });
            unit1.StepItems1.Add(new StepItem { Tip = "初始化", Step = 1 });
            unit1.StepItems2.Add(new StepItem { Tip = "开始", Step = 0 });
            unit1.StepItems2.Add(new StepItem { Tip = "结束", Step = 1 });
            var unit2 = new UnitItem { Name = "单元2", CurStep = 0 };
            unit2.StepItems1.Add(new StepItem { Tip = "就绪", Step = 0 });
            unit2.StepItems1.Add(new StepItem { Tip = "初始化", Step = 1 });
            unit2.StepItems2.Add(new StepItem { Tip = "开始", Step = 0 });
            unit2.StepItems2.Add(new StepItem { Tip = "结束", Step = 1 });
            dc.UnitItems.Add(unit1);
            dc.UnitItems.Add(unit2);
    public class VMBase : INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        // This method is called by the Set accessor of each property.
        // The CallerMemberName attribute that is applied to the optional propertyName
        // parameter causes the property name of the caller to be substituted as an argument.
        public void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    public class StepItem
        public string Tip { get; set; }
        public ushort Step { get; set; }
    public class UnitItem : VMBase
        public string Name { get; set; }
        private ushort _CurStepp;
        public ushort CurStep {
            get { return _CurStepp; } 
            set { 
                _CurStepp = value;
                NotifyPropertyChanged();
        private ushort _SelStep;
        public ushort SelStep
            get { return _SelStep; }
                _SelStep = value;
                NotifyPropertyChanged();
        public ObservableCollection<StepItem> StepItems1 { get; set; } = new ObservableCollection<StepItem>();
        public ObservableCollection<StepItem> StepItems2 { get; set; } = new ObservableCollection<StepItem>();
    public class DC_Main
        public ObservableCollection<UnitItem> UnitItems { get; set; } = new ObservableCollection<UnitItem>();
                    目录引子未实现功能示例代码运行效果替代方案引子在项目中需要使用DataGrid控件中的DataGridComboBoxColumn列来实现绑定下拉列表功能。未实现功能示例代码XAML代码:&lt;Window x:Class="DGComboBoxDemo.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.micr
this.datagridview2.EditingControlShowing += new System.Windows.Forms.DataGridViewEditingControlShowingEventHandler(this.datagridview2_EditingControlShowing);/*添加事件*/
private void datagridvie...
				
js:function initDataEditDg() { var _KKXMItems = [{ "FYLXID": 0, "FYLXMC": "现金" }, { "FYLXID": 1, "FYLXMC": "货扣" }] $("#dataEditDg").datagrid({ title:
WPF, DataGridDataGridComboBoxColumn,如何单击显示下拉框默认双击才能出现下拉框,现在客户需要单击就显示,如何解决。 默认双击才能出现下拉框,现在客户需要单击就显示,如何解决。 step 1: private void datagrid1_CurrentCellChanged(object sender, EventArgs e) datagrid1...
DataGrid控件是.net里面应用非常广泛的控件,在实际工作,经常需要用户在输入数据的时候能够直接从几个备选数据进行选择,就是要嵌入下拉列表框,或者输入日期和时间,就是用到嵌入的DateTimePacker控件,还有使用复选框。 这里是一个完整的c#工程,演示了在这些控件的使用。
<DataGrid Margin="1" ItemsSource="{Binding TagData,Mode=TwoWay}" AutoGenerateColumns="False" CanUserReorderColumns="False" CanUserSortColumns="False" SelectionMode="Single" CanUserAddRows="False"> 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录WPF DataGrid 单元格实现下拉框选项前言一、问题二、示例1.实现效果2.描述三、解决方法四、总结 需要实现DataGrid控件单元格下拉框选项,DataGrid数据来源是数据库的表 第一次写博客,尝试一下 网上有很多关于DataGridComboBoxColumn以及DataGridTemplateColumn模板列的教程,需要在前台XAML进行添加,这
本次的文献是Wpf mvvm框架下实现表格编辑,在表格内放入下拉框,给表格内的下拉框赋予数据库的数据如何实现。这个问题困扰了我很久,应为在Mvvm模式下不能直接选择下拉框的名称,直接赋值,然后用普通的下拉框赋值的方法也赋值不了,我也想了办法用Wpf那种下拉框赋值也赋值不了。在网上找了资料也很少,后面找到一个相似的方法,然后根据他的方法改写成了我现在需要的方法才实现了这个功能。 首先这就是我们的html 这就是表格内的单位下拉框,然后我们赋值的就是UnitSheet,这个了。 <DataGri
DatePicker 和新的 DataGrid 行 用户与 DataGrid 日期列的交互给我造成了很大的麻烦。 我通过将一个 Data Source 对象拖动到 WPF 窗口上,创建了一个 DataGrid。 设计器的默认行为是为该对象的每个 DateTime 值创建一个 DatePicker。 例如,下面是为一个 DateScheduled 字段创建的列: 二、主要代码部分(使用MVVM Light框架): 1.主窗体xaml代码 (MainWindow.xaml): <Window x:Class="WpfApp2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.m
关于WPFDataGridComboBox的内容显示异常的问题,可能会有多种原因。以下是一些可能的解决方法: 1. 如果ComboBox的ItemsSource是绑定的,那么可能是绑定的数据源发生了变化,但是ComboBox没有及时刷新。可以尝试调用ComboBox的UpdateLayout()或者InvalidateVisual()方法来强制刷新界面。 2. 另外,如果ComboBox的数据源包含了空值或者重复的值,可能会导致显示异常。可以尝试对数据源进行过滤,只保留有效的选项。 3. 如果ComboBox的内容是从数据库读取的,可能是因为数据类型不匹配导致的。可以检查数据库的数据类型和ComboBox的数据类型是否一致。 4. 另外,如果ComboBox的选项是从多个表格读取的,可能需要使用Join语句来将数据合并到一个表格,再绑定到ComboBox上。 希望以上方法能够帮助解决你的问题。