Change Sort List View Property / Direction Only in XAML

I have a simple ListView and want to sort the contents in numerical or alphabetical order, ascending or descending. The selection comes from the drop-down list. I understand that to achieve sorting, I can use CollectionViewSource , but how can I change SortDescription or direction on the fly?

Update:

Ok, so I configured my CVS so that viewModel is what is currently associated with ListView. I require the Name property to be bound to the currently selected property of the list item with the List PropertyName . The combo box is tied to a custom list that displays the name of the property on which I want to sort.

He complains about PropertyName that im trying to use:

Binding cannot be set in the PropertyName property of type 'SortDescription. Binding can only be set to the DependencyProperty of a DependencyObject.

  <CollectionViewSource Source="{StaticResource viewModel.ListValues}" x:Key="cvs"> <CollectionViewSource.SortDescriptions> <scm:SortDescription PropertyName="{Binding Path=SortPropertyName, Source=comboSort}"/> </CollectionViewSource.SortDescriptions> </CollectionViewSource> <ListView ItemsSource="{Binding Source={StaticResource cvs}}" /> 
+6
source share
2 answers

you can code it all in your view model

 // in your view model private void ChangeSorting () { var collView = CollectionViewSource.GetDefaultView(ListValues); collView.SortDescriptions.Clear(); // do this one collView.SortDescriptions.Add(new SortDescription("YourPropertyName", ListSortDirection.Ascending)); // or this one collView.SortDescriptions.Add(new SortDescription("YourOtherPropertyName", ListSortDirection.Descending)); collView.Refresh(); } public ICollectionView ListValuesCollectionViewSource { get { return collView; } } <ListView ItemsSource="{Binding viewModel.ListValuesCollectionViewSource}" /> 

EDIT

here is a small example for your view model

 <ComboBox ItemsSource="{Binding viewmodel.YourDataForComboboxCollection, Mode=OneWay}" SelectedItem="{Binding viewmodel.SelectedCombobox}" /> 

little viewmodel

 using System.Collections.ObjectModel; using System.ComponentModel; using System.Windows; using System.Windows.Data; namespace YourNameSpace { public class ViewModel : INotifyPropertyChanged { public static readonly DependencyProperty SelectedComboboxProperty = DependencyProperty.Register("SelectedCombobox", typeof(YourDataForCombobox), typeof(ViewModel), new PropertyMetadata(default(YourDataForCombobox), new PropertyChangedCallback(SelectedComboboxCallback))); private static void SelectedComboboxCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) { var vm = sender as ViewModel; if (vm != null && e.NewValue != null && e.NewValue != e.OldValue) { vm.ChangeSorting(e.NewValue); } } public ViewModel() { this.YourDataForComboboxCollection = new ObservableCollection<YourDataForCombobox>(); } private void ChangeSorting(YourDataForCombobox newValue) { this.yourCollectionView.SortDescriptions.Clear(); this.yourCollectionView.SortDescriptions.Add(new SortDescription(newValue.PropertyName, newValue.Sorting)); this.yourCollectionView.Refresh(); } private IObservableCollection yourDataForComboboxCollection; public IObservableCollection YourDataForComboboxCollection { get { return this.yourDataForComboboxCollection; } set { this.yourDataForComboboxCollection = value; this.RaisePropertyChanged("YourDataForComboboxCollection"); } } public YourDataForCombobox SelectedCombobox { get { return (YourDataForCombobox)GetValue(SelectedComboboxProperty); } set { SetValue(SelectedComboboxProperty, value); } } private IObservableCollection yourCollection; private ICollectionView yourCollectionView; public ICollectionView YourCollectionView { get { return this.GetCollectionView(); } } private ICollectionView GetCollectionView() { if (this.yourCollection == null) { this.yourCollection = new ObservableCollection<YourDataForCollection>(); this.yourCollectionView = CollectionViewSource.GetDefaultView(this.yourCollection); // initial sorting this.ChangeSorting(null); } return this.yourCollectionView; } private void RaisePropertyChanged(string property) { var eh = this.PropertyChanged; if (eh != null) { eh(this, new PropertyChangedEventArgs(property)); } } public event PropertyChangedEventHandler PropertyChanged; } } 

hope this helps

+3
source

You can also put this into the behavior by adding another property to bind to the dynamic setting of the direction of the sort description, but this solution only works for sorting by one property. This could certainly be expanded to work for more.

XAML:

  <CollectionViewSource x:Key="GroupedMeetingItems" Source="{Binding Items}" util:CollectionViewSourceBehavior.IsAscending="{Binding IsItemsAscending}"> <CollectionViewSource.GroupDescriptions> <PropertyGroupDescription PropertyName="StartDateTime" Converter="{StaticResource DateTimeToDisplayDateConverter}" /> </CollectionViewSource.GroupDescriptions> <CollectionViewSource.SortDescriptions> <scm:SortDescription PropertyName="StartDateTime" Direction="Descending"/> </CollectionViewSource.SortDescriptions> </CollectionViewSource> 

Behavior:

 public static class CollectionViewSourceBehavior { public static readonly DependencyProperty IsAscendingProperty = DependencyProperty.RegisterAttached( "IsAscending", typeof(bool), typeof(CollectionViewSourceBehavior), new UIPropertyMetadata(false, OnIsAscendingChanged)); public static object GetIsAscending(FrameworkElement element) { return element.GetValue(IsAscendingProperty); } public static void SetIsAscending(FrameworkElement element, object value) { element.SetValue(IsAscendingProperty, value); } public static void OnIsAscendingChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) { var collectionViewSource = dependencyObject as CollectionViewSource; if (collectionViewSource == null) { return; } var isAscending = e.NewValue as bool? == true; var newSortDescription = new SortDescription { Direction = isAscending ? ListSortDirection.Ascending : ListSortDirection.Descending, PropertyName = collectionViewSource.SortDescriptions.FirstOrDefault().PropertyName }; collectionViewSource.SortDescriptions.Clear(); collectionViewSource.SortDescriptions.Add(newSortDescription); } } 
+2
source

Source: https://habr.com/ru/post/902775/


All Articles