2013-06-25 15 views
5

काम कर मैं एक ListBox है कि मैं के माध्यम से गतिशील रूप से पॉप्युलेट एक (यह एक DataTemplate में परिभाषित किया गया है, जिसके कारण बाध्यकारी कुछ हद तक असामान्य है) बंधन:लिस्टबॉक्स "IsSelected" बाइंडिंग केवल आंशिक रूप से

<ListBox SelectionMode="Extended" ItemsSource="{Binding DataContext.ResultList, RelativeSource={RelativeSource AncestorType=Window}}"> 
    <ListBox.ItemContainerStyle> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
    </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <Label Content="{Binding Object}"/> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

प्रत्येक ListBoxItem ' एस IsSelected संपत्ति कस्टम ऑब्जेक्ट पर IsSelected संपत्ति से जुड़ी है।

जब मैं व्यक्तिगत ListBoxItem एस का चयन करता हूं, बाध्यकारी ठीक से काम करता है - कस्टम ऑब्जेक्ट की IsSelected संपत्ति मेरे व्यूमोडेल में अपडेट की जाती है। हालांकि, अगर मैं Ctrl + A कमांड के साथ ListBoxItem एस का चयन करता हूं, तो वर्तमान में केवल ListBoxItem s (जो वर्तमान में मेरे स्क्रॉलिंग व्यूपोर्ट में हैं) उनके व्यूमोडेल बाइंडिंग अपडेट करते हैं। अग्रभाग पर, सभी ListBoxItem एस का चयन किया जा रहा है, और कंटेनर ListBox पर संपत्ति दिखाती है कि सभी आइटम चुने गए हैं।

इसके अलावा, के रूप में मैं Ctrl + A के साथ सभी ListBoxItem रों चयन करने के बाद ListBox के माध्यम से स्क्रॉल, बाइंडिंग सफलतापूर्वक जब प्रत्येक ListBoxItem दृश्य में स्क्रॉल किया है अपडेट किया जाता है।

यह बाध्यकारी केवल आंशिक रूप से क्यों काम करता है? IsSelected संपत्ति के बाध्यकारी को संभालने का कोई बेहतर तरीका है जब बड़ी संख्या में ListBoxItems एक साथ चुना जा सकता है?

संपादित करें: यह व्यवहार Ctrl + A कमांड के साथ विशेष रूप से नहीं होता है - मैं जब एक पारी + क्लिक का उपयोग कर सभी आइटम का चयन एक ही परिणाम मिलता है।

+1

मैं ऐसा करने के लिए यूआई पर निर्भर नहीं हूं, तो आप 'कीबाइंडिंग' डाल देंगे और इसे व्यूमोडेल में करेंगे, या कुछ कोड पीछे रखें और चयन तर्क को वीएम में प्रतिनिधि दें। या एक व्यवहार या कुछ जो उस महत्वपूर्ण संयोजन पर प्रतिक्रिया करता है डाल दें। –

+0

@ हाइकोकोर - समस्या सभी ऑर्डर को विशेष रूप से चुनें; एक ही समस्या तब होती है जब मैं Shift + क्लिक का उपयोग करके प्रत्येक आइटम का चयन करता हूं। –

+1

मैं इस तरह के मुद्दे में भाग गया। मैंने अभी छोड़ दिया है और [selectItems] (http://msdn.microsoft.com/en-us/library/system.windows.controls.listbox.selecteditems.aspx) पर बाध्यकारी उपयोग किया है, क्लिक पर हैंडलर के लिए तर्क के रूप में बटन, और इसे एक दिन कहा जाता है (आप इसे कमांड के लिए कमांड पैरामीटर के रूप में भी इस्तेमाल कर सकते हैं)। सूची लंबी होने पर वर्चुअलाइजेशन को बंद करने के लिए प्रदर्शन हिट के लायक नहीं है। –

उत्तर

5

मुझे लगता है कि व्यवहार आप देख रहे हैं VirtualizingStackPanel.IsVirtualizing के कारण करने के लिए डिफ़ॉल्ट रूप से जो True है जब ListBox

की ItemsSource के लिए बाध्य आप उदाहरण के लिए सेट अपने ListBox जैसे कि अगर है:

<ListBox VirtualizingStackPanel.IsVirtualizing="False" SelectionMode="Extended" ItemsSource="{Binding DataContext.ResultList, RelativeSource={RelativeSource AncestorType=Window}}"> 

या

<ListBox ...> 
    ... 
    <ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel /> 
    </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

तो आपको अपने सभी बाध्य वस्तुओं कोदेखना चाहिएCtrl + A के साथ तदनुसार अपडेट कर या Shift + ... इस तरह के और भी वर्चुअलाइजेशन कंप्यूटिंग आवश्यक ScrollBar.Height जैसी चीजों के लिए समायोजित करने के लिए सही मान रिपोर्ट करेंगे साथ संग्रह की Count रूप

गुण। व्यू-पोर्ट के बाहर मौजूद आइटम को प्रस्तुत नहीं किया जाता है, इसलिए जब तक वे वास्तव में उपयोग नहीं करते हैं तब तक कोई बाइंडिंग प्रभावी नहीं होती है।

+0

उसने ऐसा किया! धन्यवाद, और महान पकड़! –

+0

यह काम किया। लेकिन यह वर्चुअलाइजेशन क्या है और यह समस्या क्यों उत्पन्न हुई? –

+0

"मानक लेआउट सिस्टम आइटम कंटेनर बनाता है और सूची नियंत्रण से जुड़े प्रत्येक आइटम के लिए लेआउट की गणना करता है।" वर्चुअलाइज "शब्द एक तकनीक को संदर्भित करता है जिसके द्वारा यूआई तत्वों का एक उप-समूह डेटा आइटमों की एक बड़ी संख्या से उत्पन्न होता है, जिसके आधार पर आइटम स्क्रीन पर दिखाई दे रहे हैं। कई यूआई तत्व उत्पन्न करते हैं जब स्क्रीन पर केवल कुछ तत्व हो सकते हैं प्रदर्शन को नुकसान पहुंचा सकते हैं। वर्चुअलाइजिंगस्टैकपैनल यूआई बनाने के लिए आइटम्स कंट्रोल (जैसे सूची बॉक्स या लिस्ट व्यू) से आइटमकंटनर जेनरेटर के साथ दृश्य आइटम की संख्या की गणना करता है और काम करता है। केवल दृश्य वस्तुओं के लिए तत्व। " –

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