首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有自定义排序的CollectionViewSource

具有自定义排序的CollectionViewSource
EN

Stack Overflow用户
提问于 2014-06-11 01:43:28
回答 1查看 13.1K关注 0票数 11

我是WPF的新手,在尝试使用自定义排序对CollectionViewSource排序时遇到了困难。情况是这样的:

我有一个用参数调用的SearchView,这个参数变成了它的数据上下文,如下所示:

代码语言:javascript
运行
复制
mainView.SetGlobalOverlay(New SearchView With {.DataContext = interventionViewModel})

在SearchView.xaml中,我将CollectionViewSource绑定到集合:

代码语言:javascript
运行
复制
<CollectionViewSource x:Key="UnitsCollection"
                          Filter="UnitsCollection_Filter"
                          Source="{Binding Path=Units}" />

现在,我已经在另一个共享类中实现了一个IComparer接口。这个比较器在源码中其他地方的ListCollectionView上使用,运行良好。现在,我如何在CollectionViewSource上重用这个比较器呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-11 03:49:28

为了使用CollectionViewSource的自定义排序器,您必须等到ItemsControl (例如,列表框)加载完成;然后才能使用ListCollectionViewView属性获取CollectionViewSource

作为说明,下面是一个小示例,它以两种不同的方式显示整数列表:上面的列表框应用自定义排序顺序,而下面的列表框是未排序的:

MainWindow.xaml:

代码语言:javascript
运行
复制
<Window x:Class="WpfApplication27.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:clr="clr-namespace:System;assembly=mscorlib"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="300">
    <Window.Resources>
        <CollectionViewSource x:Key="MyCollectionViewSource1" Source="{Binding RawData}" />
        <CollectionViewSource x:Key="MyCollectionViewSource2" Source="{Binding RawData}" />
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <ListBox Grid.Row="0" Margin="5" Background="LightSkyBlue"
                 ItemsSource="{Binding Source={StaticResource MyCollectionViewSource1}}"/>
        <ListBox Grid.Row="1" Margin="5" Background="LightYellow"
                 ItemsSource="{Binding Source={StaticResource MyCollectionViewSource2}}"/>
    </Grid>
</Window>

MainWindow.xaml.cs:

代码语言:javascript
运行
复制
using System.Collections;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Data;

namespace WpfApplication27
{
    public partial class MainWindow : Window
    {
        public ObservableCollection<int> RawData { get; private set; }

        public MainWindow()
        {
            RawData = new ObservableCollection<int> { 10, 222, 1, 333, 2, 777, 6 };

            InitializeComponent();

            DataContext = this;            

            this.Loaded += MainWindow_Loaded;
        }

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

    // Sort by number of digits (descending), then by value (ascending)
    public class CustomSorter : IComparer
    {
        public int Compare(object x, object y)
        {
            int digitsX = x.ToString().Length;
            int digitsY = y.ToString().Length;
            if (digitsX < digitsY)
            {
                return 1;
            }
            else if (digitsX > digitsY)
            {
                return -1;
            }
            return (int) x - (int) y;
        }
    }
}
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24147585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档