You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF:DataGridComboBoxColumn数据填充与绑定异常排查

DataGridComboBoxColumn配置错误的解决方案

你的错误主要来自三个核心问题,逐一修复即可解决所有报错:

1. 枚举的访问权限问题

XDG0008错误提示MenuItems在命名空间中不存在,是因为你把MenuItems枚举定义在了MainWindow类的内部,XAML的local命名空间只能访问命名空间级别的类型,无法访问类内部的嵌套类型。

修复:将MenuItems枚举移到TestInterface命名空间下,和MainWindow、HardwareTest同级。

2. 绑定属性名大小写不匹配

HardwareTest类中的属性是menuItems(小写开头),但XAML中SelectedItemBinding绑定的是MenuItems(大写开头),WPF绑定区分大小写,这会导致绑定失效,进而引发后续的XDG0031/XDG0010错误。

修复:将XAML中的SelectedItemBinding="{Binding MenuItems}"改为SelectedItemBinding="{Binding menuItems}"。

3. 可选优化:简化枚举数据源绑定

原代码用ObjectDataProvider获取枚举值是可行的,但也可以用更简洁的x:Static方式直接绑定,避免潜在的类型解析问题。


修改后的完整代码

C#代码

namespace TestInterface
{
    // 移到命名空间下,成为顶级类型
    public enum MenuItems
    {
        none,
        manual,
        automated
    };

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        ObservableCollection<HardwareTest>? hardwareTestList;
        List<string> hardwareList = new List<string>()
        {
            "Speaker",
            "Camera",
            "Microphone",
            "Wifi", // 修正原代码拼写错误"Wif"
            "Bluetooth",
            "Screen",
            "USB Ports",
            "Ethernet Port",
            "Aux Port",
            "SD Port",
            "Keyboard",
            "VGA",
            "Display Port",
            "HDMI",
            "Battery",
            "Finger Print"
        };

        public class HardwareTest
        {
            public string? Hardware { get; set; }
            public MenuItems menuItems { get; set; }
            public Uri? TestPath { get; set; }
            public string? TestResult { get; set; }

            public HardwareTest(string? Hardware, MenuItems menuItems, Uri? TestPath, string? TestResult)
            {
                this.Hardware = Hardware;
                this.menuItems = menuItems;
                this.TestPath = TestPath;
                this.TestResult = TestResult;
            }
        }

        public MainWindow()
        {
            InitializeComponent();
            hardwareTestList = new ObservableCollection<HardwareTest>();
            foreach (var hardware in hardwareList)
            {
                hardwareTestList.Add(new HardwareTest(hardware, MenuItems.none, null, null));
            }
            dg1.ItemsSource = hardwareTestList;
        }
    }
}

XAML代码(两种可选方案)

方案1:保留ObjectDataProvider(修复后)
<Window x:Class="TestInterface.MainWindow"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:TestInterface"
        Title="Test Interface" Height="500" Width="600" ResizeMode="NoResize" Background="WhiteSmoke" WindowStartupLocation="CenterScreen">

    <Window.Resources>
        <ObjectDataProvider x:Key="myEnum" MethodName="GetValues" ObjectType="{x:Type sys:Enum}">
            <ObjectDataProvider.MethodParameters>
                <x:Type TypeName="local:MenuItems" />
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </Window.Resources>
    
    <Grid>
       <DataGrid Name="dg1" ItemsSource="{Binding}" AutoGenerateColumns="False">
         <DataGridComboBoxColumn Header="Test Type" SelectedItemBinding="{Binding menuItems}" ItemsSource="{Binding Source={StaticResource myEnum}}" />
         <!-- 添加Hardware列,让DataGrid内容更完整 -->
         <DataGridTextColumn Header="Hardware" Binding="{Binding Hardware}" />
      </DataGrid>
    </Grid>
</Window>
方案2:用x:Static简化绑定(更推荐)
<Window x:Class="TestInterface.MainWindow"
        xmlns:local="clr-namespace:TestInterface"
        Title="Test Interface" Height="500" Width="600" ResizeMode="NoResize" Background="WhiteSmoke" WindowStartupLocation="CenterScreen">
    
    <Grid>
       <DataGrid Name="dg1" ItemsSource="{Binding}" AutoGenerateColumns="False">
         <DataGridComboBoxColumn Header="Test Type" SelectedItemBinding="{Binding menuItems}" 
                                 ItemsSource="{Binding Source={x:Static local:MenuItems.none}, Converter={x:Static local:EnumValuesConverter.Instance}}" />
         <DataGridTextColumn Header="Hardware" Binding="{Binding Hardware}" />
      </DataGrid>
    </Grid>
</Window>

使用方案2需添加枚举转列表的转换器:

namespace TestInterface
{
    public class EnumValuesConverter : IValueConverter
    {
        public static EnumValuesConverter Instance { get; } = new EnumValuesConverter();

        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return Enum.GetValues(value.GetType());
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

修复后,所有XDG开头的错误都会消失,DataGridComboBoxColumn可以正常显示枚举选项并绑定到hardwareTestList中的menuItems属性。

内容的提问来源于stack exchange,提问作者Neptunas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 12:28:18