展开WPF树视图支持排序 [英] Expand Wpf Treeview to support Sorting

查看:212
本文介绍了展开WPF树视图支持排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好我创造了这个小例子,我想将它扩大到支持排序。

Hi I created this small example, and I would like to expand it to support Sorting.

 public class Country
{
    public string Name { get; set; }
    public int SortOrder { get; set; }
}



我的XAML

My xaml

<TreeView Name="CountryTreeView" ItemsSource="{Binding}">
            <TreeView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Path=Name}"/>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

和代码隐藏

readonly ObservableCollection<Country> Countries;
public MainWindow()
{
   InitializeComponent();
   Countries = new ObservableCollection<Country>
            {
               new Country{Name = "Denmark", SortOrder = 0},
               new Country{Name = "Norway", SortOrder = 1},
               new Country{Name = "Sweden", SortOrder = 2},
               new Country{Name = "Iceland", SortOrder = 3},
               new Country{Name = "Greenland", SortOrder = 4}
            };
   CountryTreeView.DataContext = Countries;
}



我想有可能使树视图,以根据国家排序在SortOrder的值。

I would like to make it possible for the Treeview to Sort the Countries depending on the SortOrder value.

它需要能够做到这一点的飞行。
所以,如果我恩。改SortOrder的= 10 NAME =丹麦树视图会自动反映这一点。

It needs to be able to do this on the fly. So if i ex. changed SortOrder = 10 for Name = "Denmark" the treeview would automatically reflect this.

推荐答案

我不认为这是一个默认排序为的TreeView。您可以将项目之前,将它们输入收集整理,或覆盖的ObservableCollection,包括排序方法。

I don't think there is a default sort for TreeViews. You can either sort the items prior to entering them into the collection, or overwrite the ObservableCollection to include a Sort method.

我将其覆盖在我的项目之一:

I overwrite it in one of my projects:

public class SortableObservableCollection<T> : ObservableCollection<T>
{
    // Constructors
    public SortableObservableCollection() : base(){}
    public SortableObservableCollection(List<T> l) : base(l){}
    public SortableObservableCollection(IEnumerable<T> l) :base (l) {}

    #region Sorting

    /// <summary>
    /// Sorts the items of the collection in ascending order according to a key.
    /// </summary>
    /// <typeparam name="TKey">The type of the key returned by <paramref name="keySelector"/>.</typeparam>
    /// <param name="keySelector">A function to extract a key from an item.</param>
    public void Sort<TKey>(Func<T, TKey> keySelector)
    {
        InternalSort(Items.OrderBy(keySelector));
    }

    /// <summary>
    /// Sorts the items of the collection in descending order according to a key.
    /// </summary>
    /// <typeparam name="TKey">The type of the key returned by <paramref name="keySelector"/>.</typeparam>
    /// <param name="keySelector">A function to extract a key from an item.</param>
    public void SortDescending<TKey>(Func<T, TKey> keySelector)
    {
        InternalSort(Items.OrderByDescending(keySelector));
    }

    /// <summary>
    /// Sorts the items of the collection in ascending order according to a key.
    /// </summary>
    /// <typeparam name="TKey">The type of the key returned by <paramref name="keySelector"/>.</typeparam>
    /// <param name="keySelector">A function to extract a key from an item.</param>
    /// <param name="comparer">An <see cref="IComparer{T}"/> to compare keys.</param>
    public void Sort<TKey>(Func<T, TKey> keySelector, IComparer<TKey> comparer)
    {
        InternalSort(Items.OrderBy(keySelector, comparer));
    }

    /// <summary>
    /// Moves the items of the collection so that their orders are the same as those of the items provided.
    /// </summary>
    /// <param name="sortedItems">An <see cref="IEnumerable{T}"/> to provide item orders.</param>
    private void InternalSort(IEnumerable<T> sortedItems)
    {
        var sortedItemsList = sortedItems.ToList();

        foreach (var item in sortedItemsList)
        {
            Move(IndexOf(item), sortedItemsList.IndexOf(item));
        }
    }

    #endregion // Sorting
}

然后,您可以通过调用类似

You would then sort it by calling something like

Countries.Sort(country => country.SortOrder);



我喜欢覆盖它,因为它让我给它添加更多的功能,以及如的IndexOf 的AddRange / RemoveRange

这篇关于展开WPF树视图支持排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆