2014-06-10 26 views
5

WPF'ye yeni yaşıyorum ve bir CollectionViewSource ürününü özel bir sıralama ile sıralamakta zorluk çekiyorum.Özel sıralama ile CollectionViewSource

Ben şöyle datacontext var olan bir parametre ile çağrılan bir SearchView var: İşte durum

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

SearchView.xaml, ben o zaman koleksiyonuna CollectionViewSource bağlamak:

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

Artık başka bir paylaşılan sınıfta uygulanan bir IComparer arabirimim var. Bu karşılaştırıcı, kaynak kodunda başka bir yerde bir ListCollectionView üzerinde kullanılır ve iyi çalışır. Şimdi, bu karşılaştırıcıyı bir CollectionViewSource üzerinde nasıl kullanabilirim?

cevap

11

CollectionViewSource için özel sıralayıcıyı kullanabilmek için, ItemsControl (ör. Liste kutusu) yüklenene kadar beklemeniz gerekir; daha sonra CollectionViewSource'un View özelliğini kullanarak ListCollectionView'u alabilirsiniz. Örnek olarak

, burada iki farklı şekilde tamsayılar listesini görüntüler küçük bir örnektir: Üst liste kutusu özel bir sıralama düzeni uygular, alt liste kutusu sıralanmamış ise:

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

Name özelliği ile bir ObservableCollection için nasıl çalışır? Burada belirtildiği gibi bir kültür değişmez osrt yapmaya çalışıyorum stackoverflow.com/questions/31332882/culture-specific-sorting-on-icollectionview –

İlgili konular