Home > Programmierung > Eigene Sortierung von DataGrids in WPF

Eigene Sortierung von DataGrids in WPF

Ich war auf der Suche nach einer Möglichkeit, für einzelne Spalten in einem WPF-DataGrid eine eigene Sortierung zu verwenden. Ausgehend von der schönen Lösung bei Stackoverflow habe ich eine weitere angehängte Eigenschaft implementiert, mit deren Hlfe man festlegen kann, welche Eigenschaft der einzelnen Elemente zur Sortierung verwendet wird.

Das Schöne an dieser Variante ist die einfache Verwendung. Es muss nur im DataGrid definiert werden, dass CustomSort erlaubt ist und bei einzelnen Spalten muss noch gesagt werden, welcher Comparer verwendet werden soll (In diesem Fall eine Implemetierung von ICustomSorter.

<DataGrid ItemsSource="{Binding MyItems}" AutoGenerateColumns="False" local:CustomSortBehaviour.AllowCustomSort="True"> <DataGrid.Resources> <local:MyComparer x:Key="myCustomComparer"/> </DataGrid.Resources> <DataGrid.Columns> <DataGridTextColumn Header="MyHeader" local:CustomSortBehaviour.CustomSorter="{StaticResource myCustomComparer}" local:CustomSortBehaviour.CustomSortPropertyName="MySortingProperty" /> </DataGrid.Columns> </DataGrid>

Hier der Code für das Attached Behaviour:

public class CustomSortBehaviour { #region CustomSorter-Property public static readonly DependencyProperty CustomSorterProperty = DependencyProperty.RegisterAttached("CustomSorter", typeof(ICustomSorter), typeof(CustomSortBehaviour)); public static ICustomSorter GetCustomSorter(DataGridColumn gridColumn) { return (ICustomSorter)gridColumn.GetValue(CustomSorterProperty); } public static void SetCustomSorter(DataGridColumn gridColumn, ICustomSorter value) { gridColumn.SetValue(CustomSorterProperty, value); } #endregion #region AllowCustomSort-Property public static readonly DependencyProperty AllowCustomSortProperty = DependencyProperty.RegisterAttached("AllowCustomSort", typeof(bool), typeof(CustomSortBehaviour), new UIPropertyMetadata(false, OnAllowCustomSortChanged)); public static bool GetAllowCustomSort(DataGrid grid) { return (bool)grid.GetValue(AllowCustomSortProperty); } public static void SetAllowCustomSort(DataGrid grid, bool value) { grid.SetValue(AllowCustomSortProperty, value); } #endregion #region CustomSortPropertyName - Property public static readonly DependencyProperty CustomSortPropertyNameProperty = DependencyProperty.RegisterAttached("CustomSortPropertyName", typeof(string), typeof(CustomSortBehaviour)); public static string GetCustomSortPropertyName(DataGridColumn gridColumn) { return (string)gridColumn.GetValue(CustomSortPropertyNameProperty); } public static void SetCustomSortPropertyName(DataGridColumn gridColumn, string value) { gridColumn.SetValue(CustomSortPropertyNameProperty, value); } #endregion private static void OnAllowCustomSortChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var existing = d as DataGrid; if (existing == null) return; var oldAllow = (bool)e.OldValue; var newAllow = (bool)e.NewValue; if (!oldAllow && newAllow) { existing.Sorting += HandleCustomSorting; } else { existing.Sorting -= HandleCustomSorting; } } private static void HandleCustomSorting(object sender, DataGridSortingEventArgs e) { var dataGrid = sender as DataGrid; if (dataGrid == null || GetAllowCustomSort(dataGrid) == false) return; var listColView = dataGrid.ItemsSource as ListCollectionView; if (listColView == null) throw new Exception("The DataGrid's ItemsSource property must be of type ListCollectionView"); // Sanity check var sorter = GetCustomSorter(e.Column); if (sorter == null) return; var propertyName = GetCustomSortPropertyName(e.Column); // prevent the default sorter from working e.Handled = true; var direction = (e.Column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending; e.Column.SortDirection = sorter.SortDirection = direction; // Set Property to use if (propertyName != null) { sorter.PropertyName = propertyName; } else { DataGridBoundColumn boundColumn = e.Column as DataGridBoundColumn; if (boundColumn != null) { Binding binding = (Binding)boundColumn.Binding; sorter.PropertyName = binding.Path.Path; } } listColView.CustomSort = sorter; } } public interface ICustomSorter : IComparer { ListSortDirection SortDirection { get; set; } string PropertyName { get; set; } }

Be Sociable, Share!
KategorienProgrammierung Tags: ,
  1. Bisher keine Kommentare
  1. Bisher keine Trackbacks