我正在寻找一种将属性绑定到自定义对象ListView
DataSource
集(任何集合)的智能方法。IComparable
我希望有一个控件实时响应我的集合的变化,并ListView
使用接口方法提供的结果(在 中)进行排序。
我想可以通过创建继承自ObservableCollection<T>
或SortedSet<T>
绑定到此类的自定义集合来完成(它结合了两者的优点)。我是 WPF 绑定和搜索任何提示的新手。
我正在寻找一种将属性绑定到自定义对象ListView
DataSource
集(任何集合)的智能方法。IComparable
我希望有一个控件实时响应我的集合的变化,并ListView
使用接口方法提供的结果(在 中)进行排序。
我想可以通过创建继承自ObservableCollection<T>
或SortedSet<T>
绑定到此类的自定义集合来完成(它结合了两者的优点)。我是 WPF 绑定和搜索任何提示的新手。
您可以通过使用CollectionViewSource
,其后代包装 WPF 控件使用的所有集合来做到这一点。不过,您需要实施IComparer
。ComparableComparer<T>
在这里,我使用了一个使用实现的辅助类IComparable<T>
,但如果你愿意,你可以将你的逻辑放入Foo
类中。
主窗口.xaml
<Window x:Class="So16368719.MainWindow" x:Name="root"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ListView ItemsSource="{Binding FooItemsSource, ElementName=root}">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Name}"/>
</GridView>
</ListView.View>
</ListView>
</Window>
主窗口.xaml.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows.Data;
namespace So16368719
{
public partial class MainWindow
{
public ObservableCollection<Foo> FooItems { get; set; }
public ListCollectionView FooItemsSource { get; set; }
public MainWindow ()
{
FooItems = new ObservableCollection<Foo> {
new Foo("a"), new Foo("bb"), new Foo("ccc"), new Foo("d"), new Foo("ee"), new Foo("ffff")
};
FooItemsSource = (ListCollectionView)CollectionViewSource.GetDefaultView(FooItems);
FooItemsSource.CustomSort = new ComparableComparer<Foo>();
InitializeComponent();
}
}
public class Foo : IComparable<Foo>
{
public string Name { get; set; }
public Foo (string name)
{
Name = name;
}
public int CompareTo (Foo other)
{
return Name.Length - other.Name.Length;
}
}
public class ComparableComparer<T> : IComparer<T>, IComparer
where T : IComparable<T>
{
public int Compare (T x, T y)
{
return x.CompareTo(y);
}
public int Compare (object x, object y)
{
return Compare((T)x, (T)y);
}
}
}
笔记:
ComparableComparer<T>
是快速而肮脏的。它还应该检查空值。外部链接: