I met issues when I try to customize sorting for TreeListView control. Could you please give me some help on these issues? In general, I met 3 major issues:
Issue 1: Click one column header(e.g. "Name" column) -> the sorting is applyed and the small triangle -> Modifiy the name of Item1 as Item4 -> Item4 is not move to the bottom of tree list view.
Issue 2: Click one column header(e.g. "Name" column) -> the sorting is applyed and the small triangle -> Expand one node in tree list view -> the small triangle is not appeared anymore.
Issue 3: First expend all nodes in TreeListView -> Click one column header(e.g. "Name" column) -> All expend nodes are collapsed.
Following are all the codes of my prototype:
ViewModel.cs:
MainWindow.xaml
MainWindow.xaml.cs
Issue 1: Click one column header(e.g. "Name" column) -> the sorting is applyed and the small triangle -> Modifiy the name of Item1 as Item4 -> Item4 is not move to the bottom of tree list view.
Issue 2: Click one column header(e.g. "Name" column) -> the sorting is applyed and the small triangle -> Expand one node in tree list view -> the small triangle is not appeared anymore.
Issue 3: First expend all nodes in TreeListView -> Click one column header(e.g. "Name" column) -> All expend nodes are collapsed.
Following are all the codes of my prototype:
ViewModel.cs:
public class ViewModel { public ViewModel() { Items = new ObservableCollection<ItemVM>(); InitItems(); } public ObservableCollection<ItemVM> Items { get; set; } private void InitItems() { for (int i = 1; i < 4; i++ ) { ItemVM item = new ItemVM("Item" + i); Items.Add(item); } int index = 1; foreach (ItemVM itemvm in Items) { for (int i = 1; i < 4; i++ ) { ItemVM item = new ItemVM(String.Format("Item{0}-Object{1}",index,i)); itemvm.Items.Add(item); } index++; } } } public class ItemVM { public ItemVM(string name) { this.Name = name; Items = new ObservableCollection<ItemVM>(); } public string Name { get { return m_cached_name; } set { if (m_cached_name != value) { m_cached_name = value; } } } public ObservableCollection<ItemVM> Items { get; set; } private String m_cached_name; }MainWindow.xaml
<Window xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" x:Class="RedTreeView_Demo.MainWindow" xmlns:vm="clr-namespace:RedTreeView_Demo" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <vm:ViewModel x:Key="view_model"/> </Window.Resources> <Grid> <telerik:RadTreeListView Name="RadTreeListView1" ItemsSource="{Binding Source={StaticResource view_model}, Path=Items}" Sorting="RadTreeListView1_Sorting"> <telerik:RadTreeListView.ChildTableDefinitions> <telerik:TreeListViewTableDefinition ItemsSource="{Binding Items}"/> </telerik:RadTreeListView.ChildTableDefinitions> <telerik:RadTreeListView.Columns> <telerik:GridViewDataColumn DataMemberBinding="{Binding Name}" Header="Name" /> </telerik:RadTreeListView.Columns> </telerik:RadTreeListView> </Grid> </Window>MainWindow.xaml.cs
namespace RedTreeView_Demo { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void RadTreeListView1_Sorting(object sender, Telerik.Windows.Controls.GridViewSortingEventArgs e) { //Gets the value of the ItemSource property IEnumerable<ItemVM> ItemVMs = e.DataControl.ItemsSource as IEnumerable<ItemVM>; if (ItemVMs == null) { e.Cancel = true; return; } //If the sorting state is none or descending, sort the items ascending if (e.OldSortingState == SortingState.None || e.OldSortingState == SortingState.Descending) { e.NewSortingState = SortingState.Ascending; ItemVMs = ItemVMs.OrderBy(item => item.GetType().GetProperty(e.Column.UniqueName).GetValue(item, null)); foreach (ItemVM itemVM in ItemVMs) { IEnumerable<ItemVM> ivms = itemVM.Items as IEnumerable<ItemVM>; ivms = ivms.OrderBy(item => item.GetType().GetProperty(e.Column.UniqueName).GetValue(item, null)); itemVM.Items = new ObservableCollection<ItemVM>(); foreach (ItemVM item in ivms) { itemVM.Items.Add(item); } } } //If the sorting state is ascending, sort the items descending else if (e.OldSortingState == SortingState.Ascending) { e.NewSortingState = SortingState.Descending; ItemVMs = ItemVMs.OrderByDescending(item => item.GetType().GetProperty(e.Column.UniqueName).GetValue(item, null)); foreach (ItemVM itemVM in ItemVMs) { IEnumerable<ItemVM> ivms = itemVM.Items as IEnumerable<ItemVM>; ivms = ivms.OrderByDescending(item => item.GetType().GetProperty(e.Column.UniqueName).GetValue(item, null)); itemVM.Items = new ObservableCollection<ItemVM>(); foreach (ItemVM item in ivms) { itemVM.Items.Add(item); } } } //Set the sorted collection as source of the RadTreeListView e.DataControl.ItemsSource = ItemVMs.ToList(); e.Cancel = true; } } }