【问题标题】:Why does this CollectionViewSource not sort on the enum's ToString() result?为什么这个 CollectionViewSource 不对枚举的 ToString() 结果进行排序?
【发布时间】:2017-11-27 20:16:18
【问题描述】:

我有一个用于为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}}" />

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

【问题讨论】:

    标签: c# wpf sorting collectionviewsource


    【解决方案1】:

    看起来像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 上设置一个属性更改处理程序——我想我曾经写过这样一个东西,让我们看看我是否可以挖掘它...

    【讨论】:

    • 如果你有一个例子,它会有所帮助。我自己尝试了这种行为,但我从来没有得到有效的View。行为中的所有事件似乎都在它建立之前触发,所以我没有什么可以分配分类器。
    • 从头开始。我可以使用CollectionViewSource 上的Filter 事件。我只是在那里设置了一个条件,只设置一次分拣机,它似乎工作正常。谢谢,埃德。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2015-12-27
    • 1970-01-01
    • 2014-08-13
    • 2011-01-09
    • 1970-01-01
    相关资源
    最近更新 更多