Hi!
Anyone knows how to return a value from Dispatcher.Invoke in WPF? I want to return the selected index for a combobox.
Thanks!
Hi!
Anyone knows how to return a value from Dispatcher.Invoke in WPF? I want to return the selected index for a combobox.
Thanks!
int result = -1;
// this is synchronous
myCombo.Invoke(() => 
{
  result = myCombo.SelectedIndex;
});
return result;
This is, of course, kind of clunky. Better design would be to bind the selected index property of your combo box to a Dependency Property of a ViewModel.
You can't do this directly but you can do this.
Dispatcher.Invoke() actually returns the return value from the delegate you call, so alter your delegate accordingly.
Return Value
Type: System.Object The return value from the delegate being invoked or null if the delegate has no return value.
This is my method to retrieve selected value for a combobox, how can I say delegate to return value?
    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;
            }
    }
Hi! I have solved this. The solution is create a custom delegate that returns the desired type like this:
    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();