2010-03-22 17 views

उत्तर

27
int result = -1; 

// this is synchronous 
myCombo.Invoke(() => 
{ 
    result = myCombo.SelectedIndex; 
}); 

return result; 

यह निश्चित रूप से, तरह का गुंजाइश है। बेहतर डिजाइन आपके वीएम में बदलकर INotifyProperty को कार्यान्वित करना होगा, एक चयनित इंडेक्स प्रॉपर्टी बनाएं और SelectedIndex अपने कॉम्बो बॉक्स की संपत्ति को बांधें। आईएनपीसी बाइंड थ्रेड-असंवेदनशील (3.5 या 4.0+, मुझे याद नहीं है), ताकि आप चिंता के बिना अपने वीएम में अलग-अलग धागे से इन गुणों को पढ़ और अपडेट कर सकें।

0

आप इसे सीधे नहीं कर सकते लेकिन आप यह कर सकते हैं।

डिस्पैचर.इनवोक() वास्तव में आपके द्वारा कॉल किए गए प्रतिनिधि से वापसी मूल्य लौटाता है, इसलिए तदनुसार अपने प्रतिनिधि को बदलें।

वापसी मूल्य

प्रकार: प्रतिनिधि लागू किया जा रहा है या अशक्त से वापसी मान System.Object यदि प्रतिनिधि कोई वापसी मूल्य है।

Source

+0

ऊपर मैं अपना स्निपेट कोड पोस्ट करता हूं, मैं इसे कैसे संशोधित कर सकता हूं ताकि प्रतिनिधि को कम्बोबॉक्स के लिए चयनित मूल्य लौटा सकें? धन्यवाद – toni

+0

एक्शन रिटर्न वैल्यू की अनुमति नहीं देता है, इस मामले में आपको @Will – Chris

+0

जैसे समाधान का उपयोग करना होगा, समाधान समाधान कॉम्बोबॉक्स डब्ल्यूपीएफ कंट्रोल में काम नहीं करेगा। मुझे एक त्रुटि मिलती है। – toni

2

यह एक combobox के लिए चयनित मान प्राप्त करने के लिए अपने विधि है, मैं कैसे कह सकते हैं प्रतिनिधि मान देने के लिए?

private object getValueCB(System.Windows.Controls.ComboBox cb) 
    { 
     object obj; 


      if (!cb.Dispatcher.CheckAccess()) 
      { 
       obj = cb.Dispatcher.Invoke(
        System.Windows.Threading.DispatcherPriority.Normal, 
        new Action(
        delegate() 
        { 
         obj = cb.SelectedValue; 
        } 
       )); 

       return obj; 
      } 
      else 
      { 
       return obj = cb.SelectedValue; 
      } 

    } 
1

मैंने इसे हल किया है।

private object GetValueCB(System.Windows.Controls.ComboBox cb) 
    { 
     object obj = null; 


      if (!cb.Dispatcher.CheckAccess()) 
      { 
       obj = cb.Dispatcher.Invoke(
        System.Windows.Threading.DispatcherPriority.Normal, 
        (MyDelegate) 
        delegate() 
        { 
         return (obj = cb.SelectedValue); 
        } 
       ); 

       return obj; 
      } 
      else 
      { 
       return obj = cb.SelectedValue; 
      } 

    } 

    public delegate object MyDelegate(); 
24

) एक और तरीका है कि आह्वान (से मान देता है:

object oIsLoaded = container.Dispatcher.Invoke(new Func<bool> (() => 
    { 
     return container.IsLoaded; 
    }) 
); 

और वैसे, संभावना है कि शुरुआत में होते हैं समाधान है कि इस तरह वांछित प्रकार देता है एक कस्टम प्रतिनिधि बनाने है कोड (जो प्रतिनिधि के साथ काम कर रहा है) oIsLoaded को बिल्कुल संशोधित नहीं करेगा; इसलिए मैं उस तरह के फ़ंक्शन से मूल्य लौटने के लिए Func<> का उपयोग करूंगा।