C# 如何在WPF中对分层数据进行排序?

C# 如何在WPF中对分层数据进行排序?,c#,.net,wpf,silverlight,xaml,C#,.net,Wpf,Silverlight,Xaml,我正在创建一个菜单,将其菜单项从不同的模块注入其中(我正在使用复合应用程序库:Unity,Prism) 例如: File - Open - New - A (injected from ModuleA) - B (injected from ModuleB) - C (injected from ModuleC) - Exit 文件 -打开 -新的 -A(从模块A注入) -B(从模块B注入) -C(从ModuleC注入) -出口 因为我不知道将注入哪些项目,我需要以某种方式对菜单项进

我正在创建一个菜单,将其菜单项从不同的模块注入其中(我正在使用复合应用程序库:Unity,Prism)

例如:

File - Open - New - A (injected from ModuleA) - B (injected from ModuleB) - C (injected from ModuleC) - Exit 文件 -打开 -新的 -A(从模块A注入) -B(从模块B注入) -C(从ModuleC注入) -出口 因为我不知道将注入哪些项目,我需要以某种方式对菜单项进行排序。我现在正试图通过创建一个从MenuItem继承的RankedMenuItem来实现这一点。RankedMenuItem还有一个属性Rank,它是一个整数

我将“文件->退出”菜单项设置为等级1000,“文件->打开”菜单项设置为等级0,这样退出将始终显示在文件菜单的底部,打开将始终显示在顶部

我遇到的问题是,我无法找出对菜单层次结构进行排序的最佳方法。我可以使用CollectionView轻松地对顶层进行排序,但我无法找出如何将其应用于子项


任何建议都将不胜感激。

默认情况下,MenuItem.ItemsSource可以包含任何基于集合的集合。例如,这可以是排序列表,也可以是collectionviewsource。如果集合中的项是特定于域的(例如,不是MenuItem对象),则您的任务可能不那么琐碎。根据您的描述,您的模块似乎将一个简单的MenuItem对象直接注册到“新”MenuItem的项中,因此无法执行排序。如果是这种情况,我的建议是使用类似ObversableCollection的东西,通过添加/删除哪些项,并通过附加到“New”菜单项的MenuItems属性的CollectionViewSource使用这些项。这应该允许您对其他模块动态添加的菜单项进行排序(不过,如何实现排序取决于您,例如,需要模块中的RankedMenuItem,或者您可以简单地使用某些特定于产品的“权重”按字母顺序排序,以确保某些菜单项始终排序在其他“已知”菜单项之上/之下。)


希望这会有所帮助。

我们以类似的方式实施了我们的解决方案。对不起,我迟到了。