मैं है एक WPF ListView नियंत्रण, ItemsSource एक ICollectionView पर सेट है इस तरह से बनाया के बाद काम नहीं करते प्रकार। ListView को प्रत्येक आइटम के लिए, जटिल प्रकार पर केवल एक स्ट्रिंग प्रॉपर्टी प्रदर्शित करने के लिए कॉन्फ़िगर किया गया है।तीर कुंजी प्रोग्राम के रूप में स्थापित करने ListView.SelectedItem
उपयोगकर्ता सूची दृश्य को रीफ्रेश कर सकता है, जिस बिंदु पर मेरा तर्क वर्तमान में चयनित आइटम के लिए "कुंजी स्ट्रिंग" संग्रहीत करता है, अंतर्निहित पर्यवेक्षण चयन को फिर से पॉप्युलेट करता है। पिछला सॉर्ट और फ़िल्टर तब संग्रह दृश्य पर लागू होता है। इस बिंदु पर मैं उस आइटम को "फिर से चुनना" चाहता हूं जिसे रीफ्रेश करने के अनुरोध से पहले चुना गया था। अवलोकन योग्य में आइटम नए उदाहरण हैं, इसलिए मैं संबंधित स्ट्रिंग गुणों की तुलना करता हूं और फिर मिलान करने वाले किसी एक को चुनें। इस तरह:
private void SelectThisItem(string value)
{
foreach (var item in collectionView) // for the ListView in question
{
var thing = item as MyComplexType;
if (thing.StringProperty == value)
{
this.listView1.SelectedItem = thing;
return;
}
}
}
यह सब काम करता है। यदि चौथा आइटम चुना जाता है, और उपयोगकर्ता F5 दबाता है, तो सूची का पुनर्गठन किया जाता है और फिर उसी स्ट्रिंग प्रॉपर्टी वाला आइटम पिछले 4 वें आइटम के रूप में चुना जाता है। कभी-कभी यह नया चौथा आइटम होता है, कभी-कभी नहीं, लेकिन यह "least astonishment behavior" प्रदान करता है।
समस्या तब आती है जब उपयोगकर्ता बाद में सूची दृश्य के माध्यम से नेविगेट करने के लिए तीर कुंजियों का उपयोग करता है। ताज़ा करने के बाद पहला ऊपर या नीचे तीर (नए) सूचीदृश्य में पहला आइटम चुना जाता है, भले ही पिछले आइटम द्वारा कौन सा आइटम चुना गया हो। अपेक्षित के रूप में कोई और तीर कुंजी काम करते हैं।
ऐसा क्यों हो रहा है?
यह सुंदर स्पष्ट रूप से "कम से कम आश्चर्य" नियम का उल्लंघन करता है। मैं इससे कैसे बच सकता हूं?
संपादित
आगे खोज करने पर, यह एक ही विसंगति अनुत्तरित
WPF ListView arrow navigation and keystroke problem द्वारा वर्णित की तरह लगता है, सिवाय इसके कि मैं और अधिक विस्तार प्रदान करते हैं।
मेरे पास समान, requring dispatch.begininvokes है जो बाद में "refocus" होगा। जवाब के रूप में खुद को चिह्नित करने के लिए मत भूलना! –
मैं इसे उत्तर के रूप में स्वीकार करना चाहता हूं, लेकिन मुझे लगता है कि मैं अभी तक नहीं कर सकता - एक टाइमर है। – Cheeso
बदसूरत, और यह भी विश्वसनीय नहीं है। एक संक्षिप्त पल के लिए, आइटम को फिर से केंद्रित करने से पहले, सूची बॉक्स केंद्रित है (आप फोकस आयताकार देख सकते हैं)। उस पल में तीर कुंजी दबाते समय, आपका चयन समाप्त हो गया है। – ygoe