2014-06-10 7 views
5

के साथ संग्रहव्यूसोर्स मैं WPF के लिए नया हूं और मुझे कस्टम प्रकार के साथ संग्रहव्यूसोर्स को सॉर्ट करने का प्रयास करने में कठिनाई हो रही है।कस्टम सॉफ़्टवेयर

मैं एक SearchView कि एक पैरामीटर जो यह इतना तरह DataContext है हो जाता है के साथ कहा जाता है:: यहाँ की स्थिति है

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

SearchView.xaml में, मैं तो संग्रह करने के लिए CollectionViewSource बाँध:

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

अब, मेरे पास पहले से ही एक अन्य साझा वर्ग में एक आईसीओएमपेयर इंटरफेस लागू है। इस तुलनाकर्ता को SourceCollectionView पर कहीं और स्रोत कोड में उपयोग किया जाता है और ठीक काम करता है। अब, मैं संग्रहकर्ता दृश्य पर इस तुलनाकर्ता का पुन: उपयोग कैसे कर सकता हूं?

उत्तर

11

CollectionViewSource के लिए कस्टम सॉर्टर का उपयोग करने के लिए, आपको ItemsControl (उदा। एक सूची बॉक्स) लोड होने तक प्रतीक्षा करना होगा; तो आप CollectionViewSource की संपत्ति का उपयोग कर 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

मैं इसे नाम संपत्ति के साथ एक पर्यवेक्षण चयन के लिए कैसे काम कर सकता हूं? मैं यहां एक संस्कृति इनवेरिएंट ओएसआरटी करने की कोशिश कर रहा हूं जैसे कि stackoverflow.com/questions/31332882/culture-specific-sorting-on-icollectionview –

संबंधित मुद्दे