Wpf 如何使用Dispatcher.Invoke返回值?

Wpf 如何使用Dispatcher.Invoke返回值?,wpf,return,invoke,dispatcher,Wpf,Return,Invoke,Dispatcher,任何人都知道如何从中返回值。在里面我想返回所选的索引 谢谢 int result = -1; // this is synchronous myCombo.Invoke(() => { result = myCombo.SelectedIndex; }); return result; 当然,这有点笨重。更好的设计是在VM中实现INotifyPropertyChanged,创建SelectedIndex属性并将组合框的SelectedIndex属性绑定到它。INPC绑定是线程不

任何人都知道如何从中返回值。在里面我想返回所选的索引

谢谢

int result = -1;

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

return result;

当然,这有点笨重。更好的设计是在VM中实现INotifyPropertyChanged,创建SelectedIndex属性并将组合框的
SelectedIndex
属性绑定到它。INPC绑定是线程不敏感的(3.5或4.0+,我不记得是哪个),因此您可以从VM中的不同线程读取和更新这些属性,而不用担心。

您不能直接执行此操作,但可以执行此操作

实际上,Dispatcher.Invoke()从调用的委托返回返回值,因此相应地修改委托

返回值

类型:System.Object返回值 从正在调用的委托或 如果委托没有返回值,则为null 价值观


这是我检索组合框所选值的方法,我如何才能说“委托返回值”

    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;
            }

    }

我已经解决了这个问题。解决方案是创建一个自定义委托,该委托返回所需的类型,如下所示:

    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();

还有一种方法可以从Invoke()返回值:

object=container.Dispatcher.Invoke(新函数(()=>
{
返回容器。已卸载;
})
);

顺便说一下,初始代码(与委托一起工作)根本不会修改
oisload
;因此,我更愿意使用a从该类函数返回值。

在上面我发布了我的代码片段,如何修改它以允许委托为combobox返回所选值?thanksAction不允许返回值,在这种情况下,您必须使用类似于@WillWill solution的解决方案在ComboBox WPF控件中不起作用。我犯了一个错误。
object oIsLoaded = container.Dispatcher.Invoke( new Func<bool> ( () =>
    {
        return container.IsLoaded;
    })
);