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
相关产品推荐
相关产品推荐

