2010-08-17 11 views
11

मैं ListVox में प्रदर्शित रिकॉर्ड्स को फ़िल्टर करने के लिए CollectionViewSource का उपयोग कर रहा हूं। Xaml निम्नानुसार है।संग्रहव्यू स्रोत से आइटम्स कैसे प्राप्त करें?

<Window x:Class="WPFStarter.ListBoxItemsFilter.ListBoxFilterUsingCollectionViewSource" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Name="userControl" 
     Title="ListBoxFilterUsingCollectionViewSource" Height="300" Width="300"> 
     <Window.Resources> 
     <CollectionViewSource Source="{Binding ElementName=userControl, Path=DataContext.Items}" 
           x:Key="cvs" Filter="CollectionViewSource_Filter"/> 
     </Window.Resources> 
    <StackPanel Orientation="Vertical"> 
     <TextBox x:Name="txtSearch" TextChanged="txtSearch_TextChanged"/> 
     <TextBlock x:Name="txtSummary" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="8"></TextBlock> 
     <ListBox ItemsSource="{Binding Source={StaticResource cvs}}" DisplayMemberPath="First"/> 
    </StackPanel> 

</Window> 

और यहाँ मेरे कोड-behing है (कृपया ऐसी पास इस कोड-पीछे बात नहीं, वास्तविक आवेदन में मैं इस स्थिति के लिए MVVM का सबसे अच्छा उपयोग कर रहा हूँ)।

public partial class ListBoxFilterUsingCollectionViewSource : Window 
    { 
     private string _text=""; 
     private readonly CollectionViewSource _viewSource; 

     public ListBoxFilterUsingCollectionViewSource() 
     { 
      InitializeComponent(); 
      _viewSource = this.FindResource("cvs") as CollectionViewSource; 
     } 

     private void CollectionViewSource_Filter(object sender, FilterEventArgs e) 
     { 
      var character = e.Item as Character; 
      e.Accepted = character != null && character.First.ToLower().Contains(_text.ToLower()); 
     } 

     private void txtSearch_TextChanged(object sender, TextChangedEventArgs e) 
     { 
      _text = txtSearch.Text; 
      _viewSource.View.Refresh(); 

      SetSummary(); 
     } 

     private void SetSummary() 
     {     
      var initialCount = 10; //HELP???? 
      var filteredCount = 10; //HELP???? 
      txtSummary.Text = String.Format("{0} of {1}", filteredCount, initialCount); 
     } 
    } 

प्रश्न: मैं "SetSummary" विधि है, जिसमें मैं "initialCount" और CollectionViewSource वस्तु से "filteredCount" प्राप्त कर सकते हैं लिखने में मदद चाहिए।

आपकी रुचि के लिए धन्यवाद।

उत्तर

6

स्रोत संग्रह और संग्रहदृश्य दोनों IENumerable लागू करते हैं ताकि आप हमेशा उन पर पुनरावृत्ति कर सकें और गिनें कि उनमें कितने हैं। लेकिन अगर आप स्रोत के रूप में उपयोग किए जाने वाले वास्तविक संग्रह तक पहुंच नहीं पाते हैं, तो मैं केवल यह करने की अनुशंसा करता हूं।

private void SetSummary() 
{ 
    int initialCount = 0; 
    foreach(var item in _viewSource.View.SourceCollection) 
    { 
     initialCount++; 
    } 

    int filteredCount = 0; 
    foreach (var item in _viewSource.View) 
    { 
     filteredCount++; 
    } 
} 
+1

सिर्फ एक नोट है कि फ़िल्टर की गई संख्या वह संख्या है यदि विस्बाइल आइटम फ़िल्टर किए गए आइटमों की गणना नहीं करते हैं। – apc

2

यदि आप एमवीवीएम कर रहे हैं, तो आप CollectionViewSource द्वारा अपनी ओर से बनाए गए एक के बजाय अपना वीएम संग्रह संग्रह बना सकते हैं। फिर, आपके पास किस प्रकार का सीवीएस बनाया गया है, इस पर आपका नियंत्रण है, इसलिए आप ListCollectionViewSource बना सकते हैं, जिसमें Count संपत्ति है। यह वास्तव में आपके द्वारा फ़िल्टर किए जा रहे डेटा के गुणों पर निर्भर करता है।

+0

क्षमा करें मुझे यह नहीं मिल सका। क्या आप संदर्भ में अपना कोड लेकर कुछ कोड के साथ व्याख्या कर सकते हैं। धन्यवाद। –

32

तुम भी मूल के लिए फ़िल्टर की गई सूची के लिए _viewSource.View.Cast<object>().Count() और _viewSource.View.SourceCollection.Cast<object>().Count() कर सकता है।

+0

संग्रहव्यूसोर्स की फ़िल्टर/क्रमबद्ध सामग्री को कैसे प्राप्त किया जाए, यह स्पष्ट करने के लिए धन्यवाद। मैं आपकी टिप्पणी तक CollectionViewSource में पहला आइटम प्राप्त करने में असमर्थ था: var firstItem = this.xViewInDescendingOrder.View.Cast ()। एलिमेंट एट (0); – rfreytag

8

मुझे लगता है कि बेहतर समाधान सामान्य रूप से, लिंक है!

_viewSource.View.Cast<[your_type]>().Count(); 

... या ...

_viewSource.View.Cast<object>().Count(); 

... आप कार्यावधि में आइटम 'प्रकार पता नहीं है, तो!

2
var count = DataGrid.ItemsSource.OfType<object>().Count(); 
+0

अपने उदाहरण –

+0

पर दिखाए गए बीटीआई का वर्णन करें इसके माध्यम से आप आइटमों की गिनती संख्या प्राप्त कर सकते हैं स्रोत उदाहरण 2, 3 – EeNiArT

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