2014-06-10 4 views
5

저는 WPF를 처음 사용하고 있으며 사용자 지정 정렬을 사용하여 CollectionViewSource를 정렬하는 데 어려움을 겪고 있습니다.사용자 지정 정렬을 사용하여 CollectionViewSource

내가 너무 같은 데이터 컨텍스트의이되는 매개 변수를 사용하여 호출되는 SearchView 있습니다 : 여기 상황이다

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

SearchView.xaml에서, 나는 다음 컬렉션에 CollectionViewSource 바인딩 :

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

이제 이미 다른 공유 클래스에서 구현 된 IComparer 인터페이스가 있습니다. 이 비교자는 ListCollectionView에서 sourcecode의 다른 어딘가에서 사용되고 잘 작동합니다. 자,이 비교자를 CollectionViewSource에서 어떻게 다시 사용할 수 있습니까?

답변

11

CollectionViewSource에 맞춤 분류기를 사용하려면 ItemsControl (예 : 목록 상자)이로드 될 때까지 기다려야합니다. CollectionViewSourceView 속성을 사용하여 ListCollectionView을 얻을 수 있습니다. 그림으로

, 여기에 두 가지 다른 방법으로 정수의 목록을 표시하는 작은 예입니다 위 목록 상자 사용자 지정 정렬 순서를 적용, 아래 목록 상자가 정렬되지 않은 반면 :

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 속성을 사용하여 ObservableCollection에서 어떻게 작동하게 할 수 있습니까? 여기에 언급 된 것과 같이 문화 invariant osrt를하려고합니다. stackoverflow.com/questions/31332882/culture-specific-sorting-on-icollectionview –

관련 문제