से हटा दिया जाता है मैं एक ListBox
है कि है अपने ItemsSource
एक कस्टम वर्ग (ठीक से) एक INotifyCollectionChanged
और एक SelectedItem
एक ViewModel में एक क्षेत्र के लिए बाध्य लागू करता है करने के लिए बाध्य।निकालें चयन जब चयनित आइटम ListBox
समस्या यह है कि जब मैं वर्तमान में SelectedItem
ItemsSource
संग्रह से हटाता हूं तो यह तुरंत चयन को पड़ोसी आइटम में बदल देता है। अगर मैं सिर्फ चयन हटा देता हूं तो मैं बहुत पसंद करूंगा।
कारण मेरे लिए यह समस्या क्यों है। ItemsSource
कक्षा में कुछ अन्य संग्रह से तत्व शामिल हैं जो या तो कुछ (रनटाइम स्थिरता के दौरान) को संतुष्ट करते हैं या Active
हैं। Active
होने के नाते SelectedItem
होने के साथ "सिंक्रनाइज़" है (इसके लिए कारण हैं)। इसलिए ListBox
में किसी आइटम को केवल तभी संभव है जब इसे चुना गया हो, जिसका अर्थ यह है कि जब उपयोगकर्ता किसी अन्य का चयन करता है तो इसे गायब होना चाहिए।
मेरे समारोह (गहरी "मॉडल" में) जब SelectedItem
बदल जाती है कहा जाता हो जाता है कि:
//Gets old Active item
var oldActiveSchema = Schemas.FirstOrDefault(sch => sch.IsActive);
//Makes the new Item active (which triggers adding it into `ItemsSource` in case it didn't satisfy the Predicate)
((PowerSchema)newActiveSchema).IsActive = true;
//Triggers PropertyChanged on ViewModel with the new Active item
CurrentSchema = newActiveSchema;
RaisePropertyChangedEvent(nameof(CurrentSchema)); (#1)
//Changes the old item so it stops being Active -> gets removed from `ItemsSource` (#2)
if (oldActiveSchema != null) { ((PowerSchema)oldActiveSchema).IsActive = false; }
मुद्दा है कि ListBox
की एक अद्यतन है कि शुरू हो पाने के लिए चाहिए था SelectedItem
के परिवर्तन के कारण किसी कारण से द्वारा (# 1) स्थगित हो जाता है (ListBox
को अद्यतन करने के लिए संदेश शायद एक WPF संदेश पाश में समाप्त होता है और वर्तमान गणना समाप्त होने तक वहां प्रतीक्षा करता है)।
ItemsSource
से oldActiveSchema
को हटाने, दूसरे हाथ पर, तत्काल है और यह भी तुरन्त है कि पुराने एक के बगल में एक एक के लिए SelectedItem
का एक परिवर्तन से चलाता है (जब आप चयनित आइटम को हटा दें, एक पड़ोसी के बजाय चयनित हो जाता) । और क्योंकि SelectedItem
का परिवर्तन मेरे फ़ंक्शन को ट्रिगर करता है जो CurrentSchema
को गलत (पड़ोसी) आइटम पर सेट करता है, यह उपयोगकर्ता द्वारा चयनित CurrentSchema
(# 1) को फिर से लिखता है और जब तक ListBox
को अपडेट करने के लिए संदेश PropertyChanged
चलाता है तो यह इसे अपडेट करता है पड़ोसी एक।
किसी भी मदद की बहुत सराहना की जाती है।
वास्तविक कोड अगर कोई बेहतर जानकारी के लिए करना चाहते हैं:
- ListBox
- ViewModel
- The model's method
- Callstack जब पड़ोसी आइटम एक उपयोगकर्ता के बजाय
SelectedItem
के रूप में चयनित हो जाता चुना- लाइन 46:
SelectedItem
उपयोगकर्ता द्वारा चुना एक के रूप में विधि डालता है सक्रिय पाने के लिए चाहिए था - लाइन 45: वर्ष
SelectedItem
बंद हो जाता है सक्रिय किया जा रहा है -> संग्रह से हटा दिया जाता (44-41) - लाइन 32:
MoveCurrencyOffDeletedElement
चालSelectedItem
- लाइन 5:
SelectedItem
एक पड़ोसी एक
- लाइन 46:
चयन को हटाने के लिए केवल आपके व्यूमोडेल में चयनित आईडीम संपत्ति को शून्य करने की आवश्यकता होनी चाहिए।चूंकि समस्या एक स्कीमा परिवर्तन है, बस अपने चुने हुए को स्थानीय चर में संग्रहीत करें, चयनित में सेट करें, और फिर * संग्रह से चयनित आइटम को हटाएं। –
[#WPF] में ड्रॉप करें (https://chat.stackoverflow.com/rooms/18165/wpf) और अगर मैं चैट में सक्रिय नहीं हूं तो मुझे एक पिंग छोड़ दें। मैंने आपके कोड पर एक नज़र डाली थी लेकिन इस मुद्दे को ट्रिगर करने के बारे में तुरंत पता नहीं लगाया जा सकता था। वहां कुछ अन्य सहायक निवासी भी हैं जो निष्क्रिय होने पर हाथ उधार दे सकते हैं। – Maverik
और वास्तव में ब्रैंडन का चयन परिवर्तन का विचार वह है जो मैं भी सोच रहा था। इसके अलावा यदि आप चयनकर्ता को बाध्य करते हैं। यह IsActive के लिए चुना गया है .. आपका चयन स्वचालित आइटम – Maverik