无需自定义代码实现Infragistics XamComboEditor按Excel升序排序
实现XamComboEditor按Excel升序排序ObservableDictionary值的方案
问题背景
你使用Infragistics XamComboEditor控件绑定ObservableDictionary<int, string>,将DisplayMemberPath设为Value,需要对包含特殊字符、数字、字母组合或单一类型的Value,按照Excel的升序排序逻辑(如示例中混合字符串按自然顺序正确排序)进行排序,且希望避免手动处理所有复杂场景。
无需手动实现全场景的解决方案
可以直接复用Windows系统内置的StrCmpLogicalW函数,它正是Excel实现自然排序的底层依赖,能自动处理所有数字、字母、特殊字符的混合排序场景,无需自己编写繁琐的排序规则。
具体实现步骤
引入Windows API函数
在项目代码中添加StrCmpLogicalW的DllImport声明:[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] private static extern int StrCmpLogicalW(string str1, string str2);实现Excel风格字符串比较器
基于API实现IComparer<string>接口,封装排序逻辑:public class ExcelStringComparer : IComparer<string> { public int Compare(string x, string y) { return StrCmpLogicalW(x, y); } }生成排序后的绑定集合
由于ObservableDictionary本身不支持排序,需将其转换为排序后的集合再绑定:- 如果仅需展示
Value:// 假设你的字典实例名为targetDict var sortedValues = targetDict.Values .OrderBy(val => val, new ExcelStringComparer()) .ToList(); xamComboEditor.ItemsSource = sortedValues; - 如果需要保留键值关联(用于后续取值):
// 先定义键值对模型类 public class DictItem { public int Key { get; set; } public string Value { get; set; } } var sortedItems = targetDict.Select(kv => new DictItem { Key = kv.Key, Value = kv.Value }) .OrderBy(item => item.Value, new ExcelStringComparer()) .ToList(); xamComboEditor.ItemsSource = sortedItems; xamComboEditor.DisplayMemberPath = "Value"; xamComboEditor.ValueMemberPath = "Key";
- 如果仅需展示
完成控件绑定
将排序后的集合赋值给XamComboEditor的ItemsSource,确保DisplayMemberPath和ValueMemberPath配置正确即可。
效果验证
该方案完全对齐Excel的升序规则,自动处理以下场景:
- 纯数字字符串按数值大小排序(如"10"排在"2"之后)
- 字母按大小写不敏感逻辑排序(默认行为,如需区分可额外调整)
- 特殊字符按系统字符集顺序排序
- 混合类型字符串自然排序(如"Test 5"排在"Test 10"之前)
内容的提问来源于stack exchange,提问作者Dox
相关产品推荐
相关产品推荐

