2010-09-02 11 views
6

मैं एक अलग कार्य में डेटा एकत्र कर रहा हूं और मैं डेटा को ObservableCollection<> का उपयोग करके परिणामस्वरूप जीयूआई घटक में जोड़ना चाहता हूं। तो मेरा कोड इस तरह कुछ चला जाता है:पर्यवेक्षण चयन को कैसे संभालें <> परिणाम एमवीवीएम में समांतर कार्य से परिणाम?

private ObservableCollection<MyItem> _items; 
public ObservableCollection<MyItem> Items 
{ 
    get { return _items; } 
    set 
    { 
    if (_items.Equals(value)) 
    { 
     return; 
    } 
    _items = value; 
    RaisePropertyChanged("Items"); 
    } 
} 

private void LoadData() 
{ 
    Task task = Task.Factory.StartNew(() => 
    { 
    ObservableCollection<MyItem> itms = _htmlParser.FetchData(...); 

    Dispatcher.CurrentDispatcher.Invoke((Action)delegate 
    { 
     Items = itms; 
    }); 
    }); 
} 

डेटा कुछ HTTP अनुरोध करने वाले घटक से प्राप्त किया जाता है। मुझे जो त्रुटि मिल रही है वह है:
Must create DependencySource on same Thread as the DependencyObject.

मैं एमवीवीएम लाइट टूलकिट फ्रेमवर्क का उपयोग कर रहा हूं। मैंने परिणाम को एक संदेश के रूप में भेजने की भी कोशिश की, लेकिन यह एक ही त्रुटि संदेश में समाप्त हो गया। कोई विचार या पॉइंटर्स?

संपादित करें:

public class MyItem 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public BitmapImage Image { get; set; } // <--- A big No No because it inherits from the DependencyObject 
    public Uri Uri { get; set; } 
} 

मैं एक byte[] डेटा प्रकार को BitmapImage बदल: यहाँ मुद्दा है।

+0

यदि आपका कार्य पृष्ठभूमि में हो रहा है, तो यह यूआई को लॉक नहीं करता है, ऐसा लगता है कि पहली चीज जो आप करते हैं वह यूआई थ्रेड में वापस आती है - क्या यह सभी यूआई इनपुट को अवरुद्ध नहीं करेगी _htmlParser डेटा ला रहा है? –

+0

@ मार्टिन, आप एक बहुत अच्छा मुद्दा उठा रहे हैं। जब मैंने सवाल एक साथ रखा, तो मैंने कोड को जल्दी से सरल बना दिया। मैंने अब एक बेहतर कोड प्रवाह के साथ सवाल अद्यतन किया है। –

उत्तर

1

अपवाद आप ("DependencyObject रूप में एक ही थ्रेड पर DependencySource बनाना होगा") हो रही है इंगित करता है कि कुछ एक पृष्ठभूमि धागे पर बनाया जा रहा है और यूआई थ्रेड पर प्रयोग किया जाता है। यूआई द्वारा उपयोग के लिए संग्रह में कोई यूआई नियंत्रण बनाया और संग्रहीत किया जा रहा है?

मुझे लगता है कि ऑब्जर्वेबल कोलेक्शन स्वयं पृष्ठभूमि थ्रेड पर बनाया जा रहा है, लेकिन मुझे नहीं लगता कि यह मुद्दा है - दुर्भाग्यवश मैं कोड में कोड करने और पुष्टि करने के लिए कार्यालय में नहीं हूं।

+0

सही। मेरी माईटेम कक्षा में मेरे पास बिटमैप इमेज संपत्ति थी, जो अंत में निर्भरता ऑब्जेक्ट क्लास से प्राप्त होती है। इसे बाइट [] डेटा प्रकार में बदलना इसके बजाय समस्या को हल करता है। –

4

आप इस हालांकि बारे में Dispatcher.CurrentDispatcherApplication.Current.Dispatcher में यकीन नहीं बदलने का प्रयास कर सकते हैं

+0

ठीक है, मैं डर जाएगा। अंतर का एहसास नहीं हुआ। धन्यवाद। –

+0

मदद की खुशी है –

+0

कोड को बेहतर तरीके से आमंत्रित करने के बाद कोड (अपडेट देखें), आपका सुझाव अब और काम करने में विफल रहा है। –

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