2010-03-22 10 views

Respuesta

27
int result = -1; 

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

return result; 

Esto es, por supuesto, algo torpe. Un mejor diseño sería implementar INotifyPropertyChanged en su VM, crear una propiedad SelectedIndex y enlazar la propiedad SelectedIndex de su cuadro combinado. Los enlaces INPC son insensibles a los subprocesos (3.5 o 4.0+, no recuerdo cuál), por lo que puede leer y actualizar estas propiedades desde diferentes subprocesos en su VM sin preocupaciones.

0

No puede hacer esto directamente, pero puede hacerlo.

Dispatcher.Invoke() en realidad devuelve el valor de retorno del delegado al que llama, por lo tanto, modifique su delegado en consecuencia.

Valor devuelto

Tipo: System.Object El valor de retorno del delegado que se invoque o nula si el delegado no tiene retorno valor.

Source

+0

Arriba Publiqué mi código de fragmento, ¿cómo podría modificar esto para permitir que el delegado devuelva el valor seleccionado para el cuadro combinado? gracias – toni

+0

La acción no permite un valor de retorno, en este caso tendrá que usar una solución como @Will – Chris

+0

La solución Will no funciona en ComboBox WPF Control. Me sale un error – toni

2

Este es mi método para recuperar el valor seleccionado para un cuadro combinado, ¿cómo puedo decir delegado para volver valor?

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

He resuelto esto. La solución es crear un delegado personalizado que devuelve el tipo deseado de esta manera:

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

Hay otra manera que devuelve el valor de Invoke():

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

Y, por cierto, lo más probable es que la primera el código (que está trabajando con delegado) no modificará oIsLoaded en absoluto; Así que prefiero usar un Func<> para devolver un valor de ese tipo de función.

Cuestiones relacionadas