2014-06-10 24 views
5

Sono nuovo a WPF e ho difficoltà a cercare di ordinare un oggetto CollectionViewSource con un ordinamento personalizzato. Ecco la situazione:CollectionViewSource con ordinamento personalizzato

Ho un SearchView che viene chiamato con un parametro che diviene è DataContext in questo modo:

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

Nel SearchView.xaml, ho quindi associare il CollectionViewSource alla raccolta:

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

Ora ho già un'interfaccia IComparer implementata in un'altra classe condivisa. Questo comparatore viene utilizzato su un oggetto ListCollectionView da qualche altra parte nel codice sorgente e funziona correttamente. Ora, come posso riutilizzare questo comparatore su una CollectionViewSource?

risposta

11

Per utilizzare lo smistatore personalizzato per CollectionViewSource, è necessario attendere fino al momento in cui viene caricato il numero ItemsControl (ad esempio una casella di riepilogo); quindi è possibile ottenere ListCollectionView utilizzando la proprietà View di CollectionViewSource.

Come illustrazione, ecco un piccolo esempio che visualizza un elenco di numeri interi in due modi diversi: la casella di riepilogo superiore applica un ordinamento personalizzato, mentre la casella di riepilogo inferiore è indifferenziati:

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

Come posso farlo funzionare per una ObservableCollection con la proprietà Name? Sto provando a fare una cultura invariante come quella menzionata qui stackoverflow.com/questions/31332882/culture-specific-sorting-on-icollectionview –

Problemi correlati