Я обнаружил, что решение Сэма работает, но обнаружил, что оно выполняет сортировку, когда все представления были добавлены в область, таким образом, сортируя представления дважды.
Хотя это все еще допустимое решение, чтение этого сообщения в обсуждении Prism заставило меня задуматься о способе реализуя это только тогда, когда регион был загружен, но до того, как были добавлены какие-либо представления.
1 – Подпишитесь на коллекцию CollectionChanged of Regions
Я поместил это в код 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;
}
}
Надеюсь, это поможет кому-то!
person
CGodo
schedule
12.03.2013