2010-07-19 11 views
10

En Silverlight 4 tengo una clase de servicio personalizada que tiene un evento Completo asincrónico. Dentro de la finalización evento tomo los datos devueltos e invocar un método de poblar a través de algo como esto:Dispatcher.Invocar con un delegado anónimo funciona en Silverlight pero no en WPF

private void service_Completed(object sender, CompletedEventArgs args) 
{ 
    Dispatcher.BeginInvoke(() => populateInbox(args.Jobs)); 
} 

private void populateInbox(List<JobViewModel> jobs) 
{ 
    inbox.DataContext = jobs; 
} 

Los BeginInvoke obras en SL4, sin embargo cuando portado a WPF me sale el siguiente error:

Cannot convert lambda expression to type 'System.Delegate' because it is not a delegate type

he intentado cambiar a un filtro en línea, delegado anónima, paramaterized:

Dispatcher.BeginInvoke(delegate(List<JobViewModel> jobs) 
{ 
    inbox.DataContext = jobs; 
}); 

Sin embargo, eso da el mismo error en tiempo de compilación.

¿Alguna idea de cómo hacer que esto funcione en WPF? Refactorizar para usar el BackgroundWorker no es una opción para mí.

Respuesta

26

Debe especificar un tipo de delegado explícito. Solo use un Action.

Dispatcher.BeginInvoke(new Action(() => populateInbox(args.Jobs)); 

Se podría, sin embargo, evitar tener que cerrar el valor args.Jobs así:

Dispatcher.BeginInvoke(new Action((jobs) => populateInbox(jobs)), jobs); 

Esto es debido a que la versión de un solo parámetro de Dispatcher.BeginInvoke tiene una firma diferente en Silverlight que en WPF. En Silverlight, toma un Action, que permite que el compilador de C# escriba implícitamente su lambda como Action. En WPF, toma un Delegate (como su Control.BeginInvoke análogo en Winforms), por lo que el compilador de C# debe tener un tipo de delegado explícitamente especificado.

+0

estoy recibiendo este error ahora: Se requiere una referencia de objeto para el campo no estático, método o propiedad 'System.Windows.Threading.Dispatcher.BeginInvoke (System.Delegate, params object []) '. Lo separé en 2 líneas para tratar de ver qué está causando el error. var d = new Action (() => populateInbox (args.Jobs)); Dispatcher.BeginInvoke (d, args.Jobs); El error ocurre en la 2da línea. –

+0

Dispatcher.BeginInvoke (d, nuevo objeto [] {args.Jobs}); Tampoco funciona –

+1

@Edward: 'Dispatcher' no es una clase estática. Tendrá que llamar a esta función dentro del contexto de un elemento UI que tenga una propiedad 'Dispatcher', o tendrá que pasar el dispatcher como otro argumento. –

Cuestiones relacionadas