Я обнаружил, что решение Сэма сработало, но обнаружил, что оно выполняет сортировку, когда все виды добавлены в регион, таким образом сортируя виды дважды.
Хотя это все еще верное решение, чтение этого поста в обсуждении Prism заставило меня задуматься о способе реализации этого только после загрузки региона, но до того, как какие-либо представления будут добавлены. 1005 *
1 - Подписаться на коллекцию «Изменившиеся регионы»
Я поместил это в код Shell ViewModel, связанный с представлением, содержащим регион, который я хочу отсортировать. Когда импорт IRegionManager разрешен, я подписываюсь на событие CollectionChanged его коллекции Regions:
this._regionManager.Regions.CollectionChanged +=
new NotifyCollectionChangedEventHandler(Regions_CollectionChanged);
2 - Изменить SortComparison региона в делегате события
Затем делегат Regions_CollectionChanged
будет выполняться всякий раз, когда коллекция Regions будет обновлена, и изменит SortComparison
моего желаемого региона:
void Regions_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
foreach (var o in e.NewItems)
{
IRegion region = o as IRegion;
if (region != null && region.Name == RegionNames.NavigationRegion)
{
region.SortComparison = CompareNavigatorViews;
}
}
}
}
3 - определение делегата CompareNavigatorViews
В моем случае я просто сортирую представления по названию сборки, в которой они содержатся, вы можете реализовать свой собственный метод сравнения здесь. Помните, что объекты, которые вы получите здесь, являются видами, а не моделями представления.
private static int CompareNavigatorViews(object x, object y)
{
if (x == null)
if (y == null)
return 0;
else
return -1;
else
if (y == null)
return 1;
else
{
AssemblyInfo xAssemblyInfo = new AssemblyInfo(Assembly.GetAssembly(x.GetType()));
AssemblyInfo yAssemblyInfo = new AssemblyInfo(Assembly.GetAssembly(y.GetType()));
return String.Compare(xAssemblyInfo.Title, yAssemblyInfo.Title);
}
}
На всякий случай, если кто-то спросит, класс AssemblyInfo - это служебный класс, который я создал. Чтобы получить название сборки, вы можете использовать эту функцию:
string GetAssemblyTitle(Assembly assembly)
{
object[] attributes = assembly.GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
if (attributes.Length == 1)
{
return (attributes[0] as AssemblyTitleAttribute).Title;
}
else
{
// Return the assembly name if there is no title
return this.GetType().Assembly.GetName().Name;
}
}
Надеюсь, это кому-нибудь поможет!