为什么此 CollectionViewSource 不对枚举的 ToString() 结果进行排序?

Why does this CollectionViewSource not sort on the enum's ToString() result?

我有一个用于为 ItemsControl:

生成项目的视图模型
public class PermissionItemViewModel
{
    public PermissionsEnum Permission {get; set;}
}

枚举本身的定义方式是列表自然不会按字母顺序排列,当控件呈现时,项目的顺序与枚举定义相同。

在我看来,我正在尝试定义一个 CollectionViewSource 并使其按本质上 myEnumValue.ToString() 对这些项目进行排序。相反,排序似乎是按照枚举值的顺序而不是(我认为的)隐式 ToString() 结果。

<CollectionViewSource x:Key="permissionsViewSource"
                      Source="{Binding PermissionItems}">  <!-- ObservableCollection<PermissionItemViewModel> -->
    <CollectionViewSource.SortDescriptions>
        <cm:SortDescription PropertyName="Permission" />
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

最终,我使用这样的来源:

<ItemsControl ItemsSource="{Binding Source={StaticResource permissionsViewSource}}" />

我希望它按枚举的名称而不是它们的值排序。我怎样才能强制它这样做?

看起来像you may be able to grab the ListCollectionView and do a custom sort on that.

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    CollectionViewSource source = (CollectionViewSource)(this.Resources["MyCollectionViewSource1"]);
    ListCollectionView view = (ListCollectionView)source.View;
    view.CustomSort = new CustomSorter();
}

public class CustomSorter : IComparer
{
    public int Compare(object x, object y)
    {
        var itemx = x as PermissionItemViewModel;
        var itemy = y as PermissionItemViewModel;

        return $"{itemx.Permission}".CompareTo($"{itemy.Permission}");
    }
}

您可以将此写成 CollectionViewSource 的附加行为,它的值将采用 属性 名称,这样可以稍稍减轻您的良心。顺便说一句,我认为您希望在 View 上设置一个 属性 更改的处理程序——我想我曾经写过这样的东西,让我们看看我是否可以挖掘它...