2010-03-03 7 views
7

में सॉर्टिंग तत्वों में मेरे पास कुछ उपयोगकर्ता नियंत्रणों के साथ एक स्टैकपैन है जो रनटाइम के दौरान जोड़े या हटा दिए जाते हैं। इन तत्वों में एक इंडेक्स है जो मैं उन्हें नया करता हूं जब मैं उन्हें नया करता हूं, मुझे इन इंडेक्स द्वारा इन तत्वों को सॉर्ट करने की आवश्यकता होती है, इसलिए मैं इंडेक्स पर आधारित एक त्वरित समाधान फ़ंक्शन देता हूं लेकिन स्वैपिंगएक स्टैकपैन WPF

पर आधारित लाइन पर
  y = items[i]; //y is a temp variable 
      items[i] = items[j]; 

मैं

मिल "निर्दिष्ट सूचकांक से प्रयोग में है। निर्दिष्ट सूचकांक पहली बार में दृश्य बच्चे डिस्कनेक्ट"

मैं एक अस्थायी चर करने के लिए उन्हें कॉपी करने की कोशिश की, संग्रह से उन्हें हटा दें और उसके बाद आवंटित उन्हें UIElem में सम्मिलित फ़ंक्शन के साथ उनके दाएं इंडेक्स में entCollection, लेकिन फिर मैं

जाओ "दृश्य निर्दिष्ट पहले से ही एक और दृश्य के एक बच्चे को या एक CompositionTarget की जड़ है"

वहाँ एक क्लोन तत्व है कि मैं जरूरत है या कुछ और im कहीं लापता है?

उत्तर

11

आप इस सूची को पूरा करने के लिए ListBox/ItemsSontrol का उपयोग क्यों नहीं करते हैं और संग्रह ViewSorce/SortDescription का उपयोग करते हैं। Stackpanel जैसे LayOut पैनलों में तत्व जोड़ना WPF ऐप्स में जाने का एक प्रभावी तरीका नहीं है। ऊर्ध्वाधर उन्मुखीकरण के साथ StackPanel ListBox/ItemsControl के लिए डिफ़ॉल्ट है, लेकिन अगर आप कुछ अलग लेआउट आप हमेशा ListBox.ItemsPanel खाका

ओवरराइड कर सकते हैं आप MVVM apporach का पालन कर सकते हैं चाहते हैं तो यह (एक संपत्ति को निर्दिष्ट करने की बात है में आपके मामले में यह इंडेक्स) आपके व्यूमोडेल क्लास में होगा और सूची में सॉर्ट डिस्क्रिप्शन सेट करें बॉक्स स्तर स्वचालित रूप से आपको यह सुविधा देगा। वास्तविक UIElements को जोड़ने और हटाने के बजाय, आपको ListBox.ItemsSource पर ऑब्जर्वेबल कोलेक्शन बाइंड को जोड़ने/निकालने की आवश्यकता है। और उचित डेटा टेम्पलेट निर्दिष्ट करें।

चेक, अगर आप इस CollectionViewSource से परिचित नहीं हैं - http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.sortdescriptions.aspx

और कोड अधिक नीचे तरह होगा .. यह बहुत सरल है।

<UserControl.Resources> 
    <CollectionViewSource x:Key="sourceCollection" Source="{Binding YourObservableCollectionProperty}"> 
     <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="YourProperty-Index"/> 
     </CollectionViewSource.SortDescriptions> 
    </CollectionViewSource> 
    </UserControl.Resources>  

    <ItemsControl ItemsSource="{Binding Source={StaticResource sourceCollection}}"/> 

ध्यान दें: < --xmlns: scm = "clr-नाम स्थान: System.ComponentModel; विधानसभा = WindowsBase" ->

+0

अच्छी तरह से मैं कर सकता था ... लेकिन जब भी मैं दो तत्वों की स्थिति स्वैप करने का प्रयास करता हूं तब भी वही परिणाम उत्पन्न होते हैं। मैं किसी भी कंटेनर का बहुत अधिक उपयोग करता हूं ... लेकिन मैं उन्हें पुन: व्यवस्थित करने में सक्षम होना चाहता हूं, या इंडेक्स द्वारा उन्हें सॉर्ट करने के लिए दूर हूं कि मैं – irco

+0

निर्दिष्ट करता हूं सबसे पहले: एक आइटम नियंत्रण का उपयोग करें, सूचीबॉक्स नहीं: पूर्व चीजों की सूचियों के लिए है स्वाभाविक रूप से चयन योग्य नहीं हैं। @irco: नियंत्रण के बाहर से इस तरह के तत्वों को मैन्युअल रूप से पुनर्स्थापित करना उस तरीके से आसानी से समर्थित नहीं है जिस पर आप इसे करने का प्रयास कर रहे हैं, लेकिन यदि आप स्रोत डेटा (नियंत्रण के बजाए) को पुन: व्यवस्थित कर सकते हैं तो आप प्राप्त करेंगे एक ही परिणाम। जॉबी का सुझाव सही है: एक संग्रह दृश्य आपके द्वारा निर्दिष्ट इंडेक्स के अनुसार स्वचालित रूप से आपकी सूची को सॉर्ट करेगा (भले ही आपकी सूची नियंत्रण की सूची हो!)। –

+0

मैं ऐसा करता हूं, तत्व बनाने के लिए डेटा एक डीबी से आता है, वे क्रमबद्ध होते हैं .. समस्या यह है कि नए तत्व किसी भी समय टेबल पर दिखाए जा सकते हैं और मैं कंटेनर के संग्रह को मिटा नहीं सकता, इसलिए जब मैं एक जोड़ता हूं पिछले तत्व की तुलना में एक सूचकांक के साथ नया तत्व और अंत में जोड़ा गया, सॉर्टिंग की आवश्यकता आती है। मैं आइटम्स कंट्रोल – irco

0

आप प्रत्येक तत्व विशिष्ट नाम दे अगर (जो सूचकांक है)। जब आप इस नियंत्रण को हटाते हैं, तो आप केवल परिणाम नियंत्रण का नाम बदल सकते हैं।

उसके बाद आपके सभी नियंत्रण को हल किया जाएगा।

+0

अद्यतन किया जाता है, वहां बहुत अधिक जानकारी होती है जो केवल इंडेक्स है, अगर मैं – irco

1

यदि आप ऐसा करना चाहते हैं तो आपको यह सुनिश्चित करने की आवश्यकता है कि अभिभावक शून्य है और यह भी कि आपके पैनल में आपकी अनुक्रमणिका उपयोग में नहीं है।

यदि आप इसे एक अस्थायी चर में बदल देते हैं, तो यह अभी भी वही संदर्भ है।

अपने UIElement को विघटित करने या स्थानांतरित करने के लिए विजुअल ट्री हेल्पर का उपयोग करें।

+0

करता हूं तो मुझे सभी जानकारी नीचे या ऊपर स्थानांतरित करने की आवश्यकता होगी, मुझे यकीन नहीं है कि मुझे आपका मतलब क्या है .... माता-पिता StackPanel है। बच्चे संग्रह, यदि यह शून्य है तो मैं वहां के बाकी तत्वों को खो दूंगा, और सूचकांक का उपयोग किया जा सकता है, लेकिन यह तत्वों को हल करने का विचार है जहां अन्य हैं .. stackPanel.Children.Insert तत्वों को नीचे धक्का देना चाहिए – irco

4

जवाब ऊपर सही है, लेकिन अगर आप अपने StackPanel नहीं बदल सकते हैं (यदि आप पर्याप्त नहीं समय है, या कई StackPanel से संबंधित कोड लिखा है) इस प्रयास करें:

  1. स्टोर एक में नियंत्रण सूची या शब्दकोश
  2. क्रमबद्ध सूची या शब्दकोश
  3. का उपयोग कर StackPanel से नियंत्रण निकालें: StackPanel.Children.Remove (बच्चे) सूची की
  4. Foreach सदस्य या शब्दकोश का उपयोग कर StackPanel करने के लिए नियंत्रण जोड़ें: StackPanel.Children.Insert (i , बच्चा);

ध्यान दें: कोड काम कर रहा है, समारोह निकालें (पेड़ से) StackPanel आइटम के से नियंत्रण निकाल देता है लेकिन इतना है कि नियंत्रण किसी भी StackPanel में डालने के लिए सक्षम या इसके बारे में एक ही है नियंत्रण स्मृति पर पहले से ही है।