1

我正在寻找一种将属性绑定到自定义对象ListView DataSource集(任何集合)的智能方法。IComparable我希望有一个控件实时响应我的集合的变化,并ListView使用接口方法提供的结果(在 中)进行排序。

我想可以通过创建继承自ObservableCollection<T>SortedSet<T>绑定到此类的自定义集合来完成(它结合了两者的优点)。我是 WPF 绑定和搜索任何提示的新手。

4

1 回答 1

0

您可以通过使用CollectionViewSource,其后代包装 WPF 控件使用的所有集合来做到这一点。不过,您需要实施IComparerComparableComparer<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>是快速而肮脏的。它还应该检查空值。
  • 您应该使用 MVVM 模式而不是代码隐藏。

外部链接:

于 2013-05-04T02:43:25.743 回答