2010-03-22 64 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<>来从这种函数中返回一个值。