2014-06-10 9 views
5

Ich bin neu in WPF und habe Probleme beim Sortieren einer CollectionViewSource mit einer benutzerdefinierten Sortierung. Hier ist die Situation:CollectionViewSource mit benutzerdefinierter Sortierung

Ich habe eine Suche, die mit einem Parameter aufgerufen wird, die Datacontext wie es ist also wird:

mainView.SetGlobalOverlay(New SearchView With {.DataContext = interventionViewModel}) 

Im SearchView.xaml binde ich dann die Collection zur Kollektion:

<CollectionViewSource x:Key="UnitsCollection" 
          Filter="UnitsCollection_Filter" 
          Source="{Binding Path=Units}" /> 

Jetzt habe ich bereits eine IComparer-Schnittstelle in einer anderen freigegebenen Klasse implementiert. Dieser Comparer wird in einem ListCollectionView an anderer Stelle im Quellcode verwendet und funktioniert einwandfrei. Nun, wie kann ich diesen Vergleich für eine CollectionViewSource verwenden?

Antwort

11

Um den benutzerdefinierten Sortierer für die CollectionViewSource zu verwenden, müssen Sie warten, bis die ItemsControl (z. B. eine List-Box) geladen ist; dann können Sie die ListCollectionView mit der View Eigenschaft der CollectionViewSource bekommen.

Als Illustration, hier ist ein kleines Beispiel, das eine Liste von ganzen Zahlen auf zwei verschiedene Arten: Das obere Listenfeld eine benutzerdefinierte Sortierreihenfolge gilt, während das untere Listenfeld unsortiert ist:

screen shot

MainWindow.xaml:

<Window x:Class="WpfApplication27.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:clr="clr-namespace:System;assembly=mscorlib" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="300"> 
    <Window.Resources> 
     <CollectionViewSource x:Key="MyCollectionViewSource1" Source="{Binding RawData}" /> 
     <CollectionViewSource x:Key="MyCollectionViewSource2" Source="{Binding RawData}" /> 
    </Window.Resources> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <ListBox Grid.Row="0" Margin="5" Background="LightSkyBlue" 
       ItemsSource="{Binding Source={StaticResource MyCollectionViewSource1}}"/> 
     <ListBox Grid.Row="1" Margin="5" Background="LightYellow" 
       ItemsSource="{Binding Source={StaticResource MyCollectionViewSource2}}"/> 
    </Grid> 
</Window> 

MainWindow.xaml.cs:

using System.Collections; 
using System.Collections.ObjectModel; 
using System.Windows; 
using System.Windows.Data; 

namespace WpfApplication27 
{ 
    public partial class MainWindow : Window 
    { 
     public ObservableCollection<int> RawData { get; private set; } 

     public MainWindow() 
     { 
      RawData = new ObservableCollection<int> { 10, 222, 1, 333, 2, 777, 6 }; 

      InitializeComponent(); 

      DataContext = this;    

      this.Loaded += MainWindow_Loaded; 
     } 

     void MainWindow_Loaded(object sender, RoutedEventArgs e) 
     { 
      CollectionViewSource source = (CollectionViewSource)(this.Resources["MyCollectionViewSource1"]); 
      ListCollectionView view = (ListCollectionView)source.View; 
      view.CustomSort = new CustomSorter(); 
     } 
    } 

    // Sort by number of digits (descending), then by value (ascending) 
    public class CustomSorter : IComparer 
    { 
     public int Compare(object x, object y) 
     { 
      int digitsX = x.ToString().Length; 
      int digitsY = y.ToString().Length; 
      if (digitsX < digitsY) 
      { 
       return 1; 
      } 
      else if (digitsX > digitsY) 
      { 
       return -1; 
      } 
      return (int) x - (int) y; 
     } 
    } 
} 
+0

Wie kann ich es für eine ObservableCollection mit Name-Eigenschaft funktionieren lassen? Ich versuche eine Kultur invariant osrt wie hier erwähnt stackoverflow.com/questions/31332882/culture-specific-sorting-on-iclectionview –