gpt4 book ai didi

wpf - 具有自定义排序的 CollectionViewSource

转载 作者:行者123 更新时间:2023-12-04 05:38:33 25 4
gpt4 key购买 nike

我是 WPF 新手,尝试使用自定义排序对 CollectionViewSource 进行排序时遇到了困难。情况如下:

我有一个使用参数调用的 SearchView,它变成了它的 datacontext,如下所示:

mainView.SetGlobalOverlay(New SearchView With {.DataContext = interventionViewModel})

在 SearchView.xaml 中,我将 CollectionViewSource 绑定(bind)到集合:
<CollectionViewSource x:Key="UnitsCollection"
Filter="UnitsCollection_Filter"
Source="{Binding Path=Units}" />

现在,我已经在另一个共享类中实现了 IComparer 接口(interface)。此比较器用于源代码中其他地方的 ListCollectionView 并且工作正常。现在,如何在 CollectionViewSource 上重用这个比较器?

最佳答案

为了使用 CollectionViewSource 的自定义排序器, 你必须等到 ItemsControl (例如列表框)已加载;那么你可以得到ListCollectionView使用 View CollectionViewSource 的属性(property).

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

screen shot

MainWindow.xaml:

<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:
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;
}
}
}

关于wpf - 具有自定义排序的 CollectionViewSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24147585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com