您好我创造了这个小例子,我想将它扩大到支持排序。
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树视图支持排序
发布评论