En Silverlight 4 tengo una costumbre de la clase de servicio que tiene un asincrónica Completado evento. Dentro de la Completó caso de que me tome los datos devueltos y la invocación de una rellenar método a través de algo como esto:

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

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

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

No se puede convertir a la expresión lambda tipo ‘System.Delegado’ porque no es un tipo de delegado

He probado a cambiar a un en-línea, anónimo, paramaterized delegado:

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

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

Alguna idea de cómo conseguir que esto funcione en WPF? Refactorización para utilizar el BackgroundWorker no es una opción para mí.

OriginalEl autor Edward J. Stembler | 2010-07-19

2 Comentarios

  1. 26

    Es necesario especificar una explícita tipo de delegado. Sólo tiene que utilizar una Action.

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

    Sin embargo, puede evitar tener que cerrar más de la args.Jobs valor como este:

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

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

    Estoy recibiendo este error ahora: Un objeto de referencia es necesario para la no-estática de campo, método o propiedad » del Sistema.Windows.Las operaciones de roscado.Despachador.BeginInvoke(Del Sistema.Delegado, params object[])’. Me separé de ella en 2 líneas de probar y ver lo que está causando el error. var d = new Acción(() => populateInbox(args.Puestos De Trabajo)); Despachador.BeginInvoke(d, args.Puestos de trabajo); Error que ocurre en la 2ª línea.
    Despachador.BeginInvoke(d, new object[] { args.Trabajos }); no funciona bien.
    Dispatcher no es una clase estática. Usted tendrá que llamar a esta función, ya sea en el contexto de un elemento de interfaz de usuario que tiene una Dispatcher de la propiedad, o tendrás que pasar en el distribuidor como otro argumento.
    Sí, tienes razón. Estoy tratando de utilizar un control de usuario de WPF desde dentro de un proyecto de libro de Excel. El control de usuario de WPF es alojado en un ActionPane con un ElementHost. El panel se crea una instancia de un control de Cinta que no tiene un Despachador de la propiedad. Gracias.

    OriginalEl autor Adam Robinson

Dejar respuesta

Please enter your comment!
Please enter your name here