1

カスタム オブジェクトListView DataSourceのセット (任意のコレクション) にプロパティをバインドするスマートな方法を探しています。IComparableコレクションの変更にリアルタイムで応答するコントロールをListView作成し、Interface メソッドによって提供される結果を ( で) ソートしたいと考えています。

ObservableCollection<T>そのようなクラスから継承するかSortedSet<T>、そのようなクラスにバインドするカスタム コレクションを作成することで実現できると思います(両方の利点を組み合わせます)。私はWPFバインディングとヒントの検索が初めてです。

4

1 に答える 1

0

を使用してこれを行うことができますCollectionViewSource。その子孫は、WPF コントロールによって使用されるすべてのコレクションをラップします。ただし、実装する必要がありIComparerます。ここでは実装を使用するヘルパー クラスComparableComparer<T>を使用しますが、必要に応じIComparable<T>てロジックをクラスに入れることができますFoo

MainWindow.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>

MainWindow.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>は迅速かつ汚いです。null もチェックする必要があります。
  • コード ビハインドではなく、MVVM パターンを使用する必要があります。

外部リンク:

于 2013-05-04T02:43:25.743 に答える