UWP DataGridComboBoxColumn绑定自定义枚举项报异常咨询
问题原因
这个异常是绑定属性用错导致的:UWP Community Toolkit 中的DataGridComboBoxColumn的Binding属性,作用范围是下拉框ItemsSource内的单个选项对象,用来做选项值匹配,不会直接绑定到DataGrid行级的业务数据对象。
你把业务属性的路径直接赋值给Binding属性后,控件会遍历所有EnumDisplay类型的下拉选项,查找和业务属性同名的属性;但EnumDisplay类只定义了Value和DisplayName两个属性,根本不存在你绑定的业务属性,自然会抛出参数错误。
正确实现方案
核心修改点是把业务属性的绑定从Binding属性迁移到SelectedValueBinding属性,同时显式指定选中值的匹配路径,不需要给Binding属性赋值。
修正后的列生成代码
List<EnumDisplay> enums = new List<EnumDisplay>(); EnumConverter converter = new EnumConverter(propertyInfo.PropertyType); foreach (var kv in converter.Labels) { enums.Add(new EnumDisplay { DisplayName = kv.Key, Value = kv.Value as Enum }); } // 业务属性绑定配置不变 Binding binding = new Binding { Path = new PropertyPath("/* 替换为实际业务属性名 */"), Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, Converter = converter }; DataGridComboBoxColumn col = new DataGridComboBoxColumn() { ItemsSource = enums, DisplayMemberPath = nameof(EnumDisplay.DisplayName), // 指定下拉选项中用于匹配选中值的属性 SelectedValuePath = nameof(EnumDisplay.Value), // 业务属性绑定赋值给SelectedValueBinding,而非Binding SelectedValueBinding = binding };
转换器优化(解决原有匹配逻辑的隐患)
原来的转换器用ToString()做值匹配,在枚举带标记位、或者值存在格式化差异时容易匹配失败,可以改成强类型相等判断,增加异常兜底:
public class EnumConverter : IValueConverter { public Dictionary<string, object> Labels { get; } = new Dictionary<string, object>(); private readonly Type _targetEnumType; internal EnumConverter(Type enumType) { _targetEnumType = enumType; foreach (object value in enumType.GetEnumValues()) { string label = Extensions.EnumValueToLabel(enumType, value); Labels.Add(label, value); } } public object Convert(object value, Type targetType, object parameter, string language) { // 用值相等判断替代字符串匹配,避免转换误差 var match = Labels.FirstOrDefault(x => Equals(x.Value, value)); return match.Key ?? string.Empty; } public object ConvertBack(object value, Type targetType, object parameter, string language) { if (value is string displayLabel && Labels.TryGetValue(displayLabel, out object enumValue)) { return enumValue; } // 匹配失败时返回枚举默认值,避免空引用异常 return Activator.CreateInstance(_targetEnumType); } }
修改后运行,控件会正确把行对象的业务枚举值和EnumDisplay.Value做匹配,选中对应选项,不会再去ItemsSource项上查找不存在的业务属性。
内容的提问来源于stack exchange,提问作者Siyh
相关产品推荐
相关产品推荐

