2010-03-22 28 views

回答

27
int result = -1; 

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

return result; 

這當然是一種笨重的。更好的設計是在您的VM中實現INotifyPropertyChanged,創建SelectedIndex屬性並將組合框的SelectedIndex屬性綁定到它。 INPC綁定是線程不敏感的(3.5或4.0+,我不記得是哪個),所以你可以從虛擬機的不同線程讀取和更新這些屬性,而不用擔心。

0

你不能直接這樣做,但你可以這樣做。

Dispatcher.Invoke()實際上會返回您調用的委託的返回值,因此請相應地更改您的委託。

返回值

類型:System被調用的委託或 空返回值 如果委託沒有返回值 。

Source

+0

上面我發佈我的代碼片段,我怎麼可以修改這個允許委託返回選擇組合框的值?謝謝 – toni 2010-03-22 12:09:54

+0

操作不允許返回值,在這種情況下,您將不得不使用像@Will – Chris 2010-03-22 12:13:35

+0

這樣的解決方案。解決方案在ComboBox WPF控件中不起作用。我收到一個錯誤。 – toni 2010-03-22 12:18:32

2

這是我的方法檢索一個下拉框選擇的值,我怎麼能說代表的返回值?

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<>來從這種函數中返回一個值。