2010-07-19 6 views
10

W Silverlight 4 Mam niestandardową klasę usług z asynchronicznym zakończeniem. Wewnątrz Zakończone razie biorę zwróconych danych i wywołać metodę zapełnić poprzez coś takiego:Dyspozytor. Wywołanie anonimowego delegata działa w środowisku Silverlight, ale nie WPF

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

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

The BeginInvoke prace w SL4, jednak kiedy przeniósł go do WPF pojawia się następujący błąd:

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

Próbuję zmienić go na in-line, anonimowy, paramaterized delegata:

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

jednak, że daje ten sam błąd kompilacji.

Każdy pomysł, jak uzyskać to działa w WPF? Refaktoryzacja w celu użycia BackgroundWorker nie jest dla mnie opcją.

Odpowiedz

26

Musisz określić jawny typ delegata. Po prostu użyj Action.

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

Można było jednak uniknąć konieczności zamykania nad wartością args.Jobs tak:

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

To dlatego, że wersja jednego parametru Dispatcher.BeginInvoke ma inny podpis w Silverlight niż w WPF. W Silverlight, zajmuje on Action, co pozwala kompilatorowi C# na niejawne wpisanie swojej lambda jako Action. W WPF zajmuje on Delegate (podobnie jak jego analogowy odpowiednik w WinForm), więc kompilator C# musi mieć jawnie określony typ delegata.

+0

dostaję ten błąd teraz: Odwołanie do obiektu jest wymagane dla non-statycznego pola, metody lub właściwości „System.Windows.Threading.Dispatcher.BeginInvoke (System.Delegate, params object []) ". Rozdzieliłem go na 2 linie, aby sprawdzić, co powoduje błąd. var d = new Action (() => populateInbox (args.Jobs)); Dispatcher.BeginInvoke (d, args.Jobs); Błąd występuje w drugiej linii. –

+0

Dispatcher.BeginInvoke (d, nowy obiekt [] {args.Jobs}); To też nie działa. –

+1

@Edward: 'Dispatcher' nie jest statyczną klasą. Będziesz musiał wywołać tę funkcję w kontekście elementu UI, który ma właściwość 'Dispatcher', lub będziesz musiał przekazać w dispatcherze jako inny argument. –

Powiązane problemy