2015-01-28 8 views
6

यूनिवर्सल ऐप (वर्तमान में केवल WP8.1-side पर) पर काम करते समय, मैंने निम्नलिखित अजीब चीज पर ठोकर खाई है।यूनिवर्सल ऐप - लोडिंग कम्बोबॉक्स 'आइटमसोर्स एसिंक अजीब व्यवहार देता है

मुझे कॉम्बोबॉक्स मिला है, UserControl (WindowsPhone-Project में स्थित) यह साझा प्रोजेक्ट में एक वीएम से जुड़ा हुआ है। आइटमसोर्स और चयनित इटिम दोनों वीएम में अपने संबंधित गुणों से बंधे हैं।

एप्लिकेशन चलाते समय, जब आप पहले आइटम को छोड़कर किसी भी आइटम का चयन करते हैं, तो यह पूरी तरह से काम कर रहा है। लेकिन, जब मैं पहली बार आइटम का चयन करें, स्ट्रिंग ComboBox में दिखाया गया है बजाय वी एम के .ToString() -method ...

(Btw, यह एक साधारण List<string> है, चयनित आइटम एक string है पता चलता है। यह नहीं कर सकते उससे अधिक सरल हो जाओ: पी)

मैंने एक नमूना ऐप बनाया है, जिसमें केवल यह कम्बोबॉक्स और वीएम है। मैं इसे पुन: उत्पन्न करने में सक्षम था, जिस क्षण मैं असीमित रूप से आइटम्ससोर्स से जुड़ी संपत्ति भरता हूं। एक तुल्यकालिक विधि से ऐसा करते समय, यह काम करता है। लेकिन इसे एसिंक विधि से भरना उपर्युक्त समस्या प्रदान करता है।

कुछ स्क्रीनशॉट: जब यह भरा हुआ है

पहले एक एप्लिकेशन को दर्शाता है। जब संग्रह बदलता है, तो सूची का पहला तत्व चुना जाता है। यह यहाँ दिखाया गया है:

After is app loaded

आप ComboBox पर क्लिक करते हैं, तो आप हमेशा की तरह उसके आइटम देखने को मिलता है: enter image description here

आप किसी भी पहले की तुलना में अन्य तत्व पर क्लिक करें कहो, आप अभी भी मिलता है सामान्य व्यवहार: enter image description here

अभी तक, सामान्य। अब पहले आइटम पर क्लिक करें। enter image description here

...

मैं यह सिर्फ तार के बजाय एक वस्तु की एक सूची बनाने जैसी चीजों की एक किस्म की कोशिश की है: आप इस मिलता है। बाध्य वस्तुओं के लिए कनवर्टर जोड़ना, केवल डीबगिंग उद्देश्यों के लिए, केवल वास्तविक स्ट्रिंग-मानों को प्रकट करता है। मैं पता नहीं कैसे मिल गया है, और न ही क्यों, आबद्ध SelectedItem अचानक ComboBox की DataContext से पता चलता ...

आप यहाँ नमूना एप्लिकेशन को डाउनलोड कर सकते हैं: http://1drv.ms/1DhklCQ

(कोई बाइनरी, बस कोड शामिल हैं)

किसी को भी कोई विचार मिला है?


संपादित करें: कोड इस समस्या को ठीक करने के लिए आवश्यक:

एक खाली यूनिवर्सल स्टोर ऐप्स (8.1) बनाएँ। विंडोजफोन परियोजना में, फ़ाइल MainPage.xaml: मैंने एक साधारण combobox जोड़ा है, और लोडेड ईवेंट पकड़ो।

<ComboBox ItemsSource="{Binding Items}" SelectedItem="{Binding SelectedItem}" /> 

इसके पीछे कोड में। मैंने डेटाकॉन्टेक्स्ट को वीएम में असाइन किया है। और लोडेड इवेंट में मैं अजीब रूप से वीएम को बुलाता हूं।LoadData()

private VM _vm = new VM(); 
public MainPage() 
{ 
    this.InitializeComponent(); 
    this.DataContext = _vm; 
} 

private async void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    await _vm.LoadDataAsync(); 
} 

के रूप में पालन वीएम वस्तु परिभाषित किया गया है:

public class VM : INotifyPropertyChanged 
{ 
    private List<string> _items; 
    public List<string> Items 
    { 
     get { return _items; } 
     set 
     { 
      _items = value; 
      _selectedItem = _items.FirstOrDefault(); 
      RaisePropertyChanged("Items"); 
      RaisePropertyChanged("SelectedItem"); 
     } 
    } 

    private string _selectedItem; 
    public string SelectedItem 
    { 
     get { return _selectedItem; } 
     set 
     { 
      _selectedItem = value; 
      RaisePropertyChanged("SelectedItem"); 
     } 
    } 

    public VM() 
    { 
    } 

    public async Task LoadDataAsync() 
    { 
     this.Items = new List<string>() 
     { 
      "a", 
      "b", 
      "c", 
      "d", 
      "e", 
      "f", 
     }; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaisePropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 
+0

आप यहां कोड क्यों पोस्ट नहीं करते? – Sajeetharan

+0

मैंने मूल पोस्ट में कोड जोड़ा है। –

+0

इसके लायक होने के लिए, हमारे पास हमारे एप्लिकेशन में भी एक ही समस्या है, जो कई एसिंक पैटर्न का उपयोग करती है। हमारा निष्कर्ष यह है कि यह कॉम्बोबॉक्स के साथ एक बग है। –

उत्तर

1

न केवल एसिंक्रोनस रूप से - अगर आप में _vm.Items = new List... शब्दों में कहें, घटना onLoaded await _vm.LoadDataAsync(); के बजाय - आप एक ही मुद्दा मिल जाएगा।

लगता है कि डेटा कॉन्टेक्स्ट को सेट करने से पहले आइटम सेट करने के बाद यह समस्या नहीं होगी।

public ObservableCollection<string> Items 
{ 
    get { return _items; } 
    set 
    { 
     _items = value; 
    // _selectedItem = _items.FirstOrDefault(); 
     RaisePropertyChanged("Items"); 
    // RaisePropertyChanged("SelectedItem"); 
    } 
} 

अब के लिए जैसा कि मैंने पता नहीं क्यों यह है:

दूसरी बात यह कि इस मुद्दे (जैसा कि मैंने कोशिश की है) दिखाई नहीं देगा आप सेट कोड से आइटम चयनित नहीं है, तो है हो जाता।

+0

हाँ, जब मैं चयनित आइटम सेट नहीं करता हूं, तो यह काम करता है ... बहुत अजीब। शायद मुझे अपना उपयोग केस बदलना चाहिए, इसलिए मुझे वास्तव में एक डिफ़ॉल्ट आइटम का चयन नहीं करना है .. –

+0

@TomWuyts यह एक बग प्रतीत होता है, इसलिए आपको वर्कअराउंड का उपयोग करने की आवश्यकता होगी। – Romasz

2

मैंने इसे चेक आउट किया और मुझे आपके कोड के साथ कोई समस्या नहीं दिखाई दे रही है, इसलिए मुझे लगता है कि यह कॉम्बोबॉक्स में एक बग है।

समस्या को समझना और सही समाधान ढूंढने में आपको कुछ समय लग सकता है, इसलिए मैं सुझाव दूंगा कि आप कुछ कामकाज का उपयोग करें जो आपके लिए काम करता है। मैं निम्नलिखित की कोशिश की और यह काम करने के लिए लग रहा था:

  1. बदलें वीएम में आइटम संपत्ति प्रकार ObservableCollection<string>
  2. एक खाली संग्रह करने के लिए वी एम के निर्माता में संपत्ति/क्षेत्र प्रारंभ की जा करने के लिए।
  3. आइटम लोड करते समय, संग्रह को भरने के बजाय संग्रह को भरें (Add() विधि का उपयोग करके आइटम जोड़ें)।

संपादित: भरने मैं इसे कैसे परीक्षण किया की मिसाल।

public class VM : INotifyPropertyChanged 
{ 
    private ObservableCollection<string> _items; 
    public ObservableCollection<string> Items 
    { 
     get { return _items; } 
     set 
     { 
      _items = value; 
      _selectedItem = _items.FirstOrDefault(); 
      RaisePropertyChanged("Items"); 
      RaisePropertyChanged("SelectedItem"); 
     } 
    } 

    private string _selectedItem; 
    public string SelectedItem 
    { 
     get { return _selectedItem; } 
     set 
     { 
      _selectedItem = value; 
      RaisePropertyChanged("SelectedItem"); 
     } 
    } 


    public VM() 
    { 
     this._items = new ObservableCollection<string>(); 
    } 

    public async Task LoadDataAsync() 
    { 
     var items = new List<string>() { 
      "1", 
      "b", 
      "c", 
      "d", 
      "e", 
      "f", 
      "f", 
      "f", 
      "f", 
      "f", 
      "f", 
     }; 

     foreach (var i in items) { 
      this._items.Add(i); 
     } 
     this.SelectedItem = items.FirstOrDefault(); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaisePropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 

यह मेरे लिए ठीक काम करता है।

+0

सुझाव के लिए धन्यवाद, मैं आज रात कोशिश करूँगा। –

+0

मैंने यह कोशिश की है, लेकिन यदि मैं 'जोड़ें()' के साथ संग्रह भरने के बाद, मैंने चयनित तत्व को पहले तत्व पर सेट किया है। और फिर जब मैं इसे चुनता हूं तो बग प्रकट होता है। –

+0

@ टॉमव्यूट्स मैंने अपना जवाब संशोधित किया, जिसे मैंने परीक्षण करने के लिए इस्तेमाल किया कोड जोड़ दिया। इस मामले में चयनित इटैम काम करना (कम से कम मेरे लिए)। – yasen

7

पिछले समाधानों से मेरी समस्या का समाधान नहीं हुआ एक कामकाज मिला।

बस बाध्यकारी और अपने combobox के किसी आइटम या अनुक्रमणिका का चयन करने के बीच एक विराम जोड़ें। नीचे

कोड:

myCombobox.ItemsSource = myList; 
await Task.Delay(100); 
myCombobox.SelectedIndex = 12; 

आशा इस मदद करता है!

+0

डेटा बाध्यकारी में त्रुटि थी। इसने बाध्यकारी आइटम स्रोत की मेरी बग हल की। धन्यवाद –

+0

केवल संभावित समाधान, आइटम्ससोर्स बाध्यकारी या चयनित आइटम मैनिपुलेशन किसी भी अन्य तरीके से इस अविश्वसनीय बग में परिणाम, इतना बुरा क्यूए। वैसे भी यह combobox पूर्णस्क्रीन चयन पर भी होता है लेकिन परिणाम एक खाली चयनित आइटम है, ठीक से combobox बांधने के लिए असंभव है – Keoz

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