2010-07-19 5 views
10

In Silverlight 4 habe ich eine benutzerdefinierte Serviceklasse, die ein asynchrones Completed-Ereignis hat. Innerhalb der Completed-Ereignis nehme ich die zurückgegebenen Daten und eine bevöl Methode über so etwas wie folgt aufrufen:Dispatcher.Invoke mit anonymen Delegaten funktioniert in Silverlight, aber nicht WPF

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

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

Die BeginInvoke Werke in SL4, aber wenn ich portiert es zu WPF bekomme ich folgende Fehlermeldung:

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

ich habe versucht, es zu einem in-line, anonym, paramaterized Delegierter Wechsel:

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

jedoch, dass die gleichen Fehler bei der Kompilierung liefert.

Haben Sie eine Idee, wie Sie dies in WPF umsetzen können? Refactoring, um die BackgroundWorker zu verwenden, ist keine Option für mich.

Antwort

26

Sie müssen einen expliziten Delegattyp angeben. Verwenden Sie einfach eine Action.

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

Sie könnten jedoch vermeiden, dass die args.Jobs Werte wie diese schließen über mit:

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

Dies liegt daran, dass die Single-Parameter-Version Dispatcher.BeginInvoke eine andere Signatur in Silverlight hat als in WPF. In Silverlight dauert es eine Action, die den C# -Compiler implizit ermöglicht, Ihr Lambda als Action einzugeben. In WPF dauert es eine Delegate (wie seine Control.BeginInvoke Analog in Winforms), so dass der C# -Compiler einen Delegate-Typ explizit angegeben haben muss.

+0

ich diesen Fehler jetzt: Eine Objektreferenz für die nicht-statische Feld, Methode oder Eigenschaft ‚erforderlich ist System.Windows.Threading.Dispatcher.BeginInvoke (System.Delegate, Parameterobjekt []) '. Ich habe es in 2 Zeilen getrennt, um zu versuchen, zu sehen, was den Fehler verursacht. var d = new Aktion (() => populateInbox (args.Jobs)); Dispatcher.BeginInvoke (d, args.Jobs); Der Fehler tritt in der 2. Zeile auf. –

+0

Dispatcher.BeginInvoke (d, neues Objekt [] {args.Jobs}); Geht auch nicht. –

+1

@Edward: 'Dispatcher' ist keine statische Klasse. Sie müssen diese Funktion entweder im Kontext eines UI-Elements mit einer 'Dispatcher'-Eigenschaft aufrufen, oder Sie müssen den Dispatcher als weiteres Argument übergeben. –

2

In WPF und winforms müssen Sie es zunächst in ein MethodInvoker umwandeln, andernfalls erhalten Sie den Fehler Kann anonyme Methode nicht in Typ "System.Delegate" konvertieren, da es kein Delegattyp ist.

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

Für weitere Informationen: http://msdn.microsoft.com/en-us/library/system.windows.forms.methodinvoker.aspx

Verwandte Themen