2013-04-18 8 views
7

मैंने एक वृक्षदृश्य बनाया जो मेरी हार्ड ड्राइव पर निर्देशिकाओं और फ़ाइलों का मॉडल करता है। प्रत्येक वृक्षदृश्य में एक चेकबॉक्स है, जो एक चयनित संपत्ति से जुड़ा हुआ है। मैं जो हासिल करना चाहता हूं वह प्रत्येक माता-पिता के लिए प्रदर्शित होता है जो कुल फ़ाइलों की गणना (चयनित बारह पर 10/12 10 फाइलों) पर चयनित फ़ाइलों की गिनती है।आइटम्ससोर्स को बाध्य करते समय संग्रह को फ़िल्टर कैसे करें?

क्या संपत्ति के साथ बाध्यकारी करने का कोई तरीका है ...?

<ContentPresenter Content="{Binding MyItems.Count where MyItems.IsSelected, Mode=OneTime}" 
        Margin="2,0" /> 
+1

क्या आप एमवीवीएम का उपयोग कर रहे हैं? – DHN

+1

वास्तव में, मैं डीएनएन हूं। –

+1

आप अपने ViewModels या वर्गों है कि कोड-पीछे भाग – Jehof

उत्तर

11

बाध्यकारी में संग्रह को सीधे फ़िल्टर करने का कोई तरीका नहीं है। हालांकि, डब्ल्यूपीएफ फ़िल्टरिंग (और सॉर्टिंग और ग्रुपिंग) संग्रह को CollectionViewSource के साथ संग्रह की अनुमति देता है।

एक दृष्टिकोण अपने ItemTemplate के संसाधनों जो ItemsSource फिल्टर में एक CollectionViewSource परिभाषित करने के लिए किया जाएगा एक तत्व है जो इस CollectionViewSource की गणना संपत्ति से जुड़ कर फिल्टर पारित की संख्या मिलता है। हालांकि, आपको कोडबेंड में अपने फ़िल्टर को परिभाषित करना होगा। कुछ इस तरह दिखेगा:

<TreeView x:Name="Tree" ItemsSource="{Binding Items}"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding ChildItems}"> 
      <HierarchicalDataTemplate.Resources> 
       <CollectionViewSource x:Key="FilteredItems" 
             Source="{Binding ChildItems}" 
             Filter="FilteredItems_OnFilter" /> 
      </HierarchicalDataTemplate.Resources> 
      <TextBlock> 
       <TextBlock.Text> 
        <MultiBinding StringFormat="{} {0} of {1} selected"> 
         <Binding Path="Count" Source="{StaticResource FilteredItems}" /> 
         <Binding Path="ItemsSource.Count" ElementName="Tree" /> 
        </MultiBinding> 
       </TextBlock.Text> 
      </TextBlock> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

और codebehind में:

private void FilteredItems_OnFilter(object sender, FilterEventArgs e) 
{ 
    var item = sender as Item; 
    e.Accepted = item.IsSelected; 
} 

मैं इसे परीक्षण नहीं किया है, लेकिन यह सामान्य रूप में काम करना चाहिए। तुम्हें पता है, हालांकि WPF के साथ कभी पता नहीं ...

+0

नीचे मतदान करने के लिए बाध्य कर रहे हैं पोस्ट कर सकते हैं? इकाई की जांच करने की कोई ज़रूरत नहीं है? फिर आप कैसे जांचते हैं कि यह कार्यक्षमता कार्य करता है? स्वचालित यूआई परीक्षण? वर्तमान दृश्य को शामिल करने के लिए यह व्यूमोडेल का विशेषाधिकार है, न कि देखें। –

+1

मैं इकाई परीक्षण करने की जरूरत यह एक ... – Marc

+0

क्या वहाँ नहीं लगता कि की वजह से TreeView –

-9

मैं व्यक्तिगत रूप से निम्नलिखित ढांचे http://logofx.codeplex.com/ अपने सभी आवश्यकताओं (LogoFX.Mini का उपयोग के रूप में यह अपने उद्देश्यों के लिए पर्याप्त लगता है) को पूरा करने लगता है जो का उपयोग करें। WrappingCollection के साथ चयन करें। आपके आइटम स्रोत चयन के रूप में चयन करें जो आप प्रदर्शित करना चाहते हैं के रूप में चयन करें। यदि आप ढांचे का उपयोग न करने का निर्णय लेते हैं, तो आपको समर्पित व्यवहार के माध्यम से चयन परिवर्तित घटना के लिए सब्सक्राइब करना चाहिए, समर्पित निर्भरता संपत्ति बनाएं और चयन में हर बार इसे अद्यतन करें।

और एक आखिरी बात: निश्चित रूप से कोड-कोड का उपयोग करने से बचें। यह पूरे एमवीवीएम सिद्धांत को तोड़ देता है।

+4

-1 - * निश्चित रूप से कोड-पीछे का उपयोग करने से बचें। * - चलो, यह बस सच नहीं है। यदि आवश्यक हो, तो आप पीछे कोड का उपयोग कर सकते हैं। 'कस्टम कंट्रोल 'पर विचार करें, आप बिना कोड के एक को कार्यान्वित करने में सक्षम नहीं हैं। लेकिन कई अन्य कारण हैं, जब कोड पीछे सबसे सरल समाधान है। यदि आप लिखेंगे ** कोशिश करें कि जब भी आप पीछे कोड का उपयोग करने से बचें। **, मैं आपके साथ रहूंगा। डीएनएन के लिए – DHN

+0

+1, मैं खुद को एक एमवीवीएम कट्टरपंथी मानता हूं, लेकिन यह निश्चित रूप से सच नहीं है। व्यवहार बीटीडब्ल्यू द्वारा codebehind से कुछ और नहीं हैं ... – Marc

+0

मैं उपयोगकर्ता नियंत्रण (उर्फ दृश्य) से प्राप्त नियंत्रणों और नियंत्रण (उर्फ कस्टम नियंत्रण) से प्राप्त किए गए नियंत्रणों के बीच अंतर करता हूं। जब मैं कोड-बैक के बारे में बात करता हूं तो मैं केवल पूर्व को संदर्भित करता हूं। और विचारों के मामले में कोड-बैक से बचा जाना चाहिए। यदि आप कोड-बैक पर बनाते हैं तो आप ऐसी चीज का परीक्षण कैसे करते हैं? यदि आप जिस सुविधा को कार्यान्वित करने का प्रयास कर रहे हैं वह शुद्ध दृश्य व्यवहार है, तो इसे कोड-बैक में लागू करने के बराबर है (फिर भी मुझे इसकी आवश्यकता नहीं है, क्योंकि आप इसे XAML में कर सकते हैं या इसे किसी व्यवहार में प्रतिनिधि कर सकते हैं), अगर यह कुछ और है, तो आप इसे गलत कर रहे हैं –

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