10

Silverlight 4 には、非同期の Completed イベントを持つカスタム サービス クラスがあります。Completed イベント内で、返されたデータを取得し、次のような方法で populate メソッドを呼び出します。

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

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

SL4 で動作しますBeginInvokeが、WPF に移植すると、次のエラーが発生します。

デリゲート型ではないため、ラムダ式を「System.Delegate」型に変換できません

私はそれをインラインの匿名のパラメータ化されたデリゲートに変更しようとしました:

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

ただし、同じコンパイル時エラーが発生します。

これをWPFで動作させる方法はありますか? を使用するためのリファクタリングBackgroundWorkerは、私にとって選択肢ではありません。

4

2 に答える 2

26

明示的なデリゲート タイプを指定する必要があります。を使用するだけActionです。

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

args.Jobsただし、次のように値を閉じる必要はありません。

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

これはDispatcher.BeginInvoke、Silverlight と WPF では単一パラメーター バージョンの署名が異なるためです。Silverlight では、 が必要Actionです。これにより、C# コンパイラは暗黙的にラムダをAction. WPF では、Delegate( Control.BeginInvokeWinforms でのアナログのように) を取るため、C# コンパイラはデリゲート型を明示的に指定する必要があります。

于 2010-07-19T19:59:49.490 に答える
2

WPF と winforms では、最初にそれを MethodInvoker にキャストする必要があります。そうしないと、デリゲート型ではないため、匿名メソッドを「System.Delegate」型に変換できませんというエラーが発生します。

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

詳細情報: http://msdn.microsoft.com/en-us/library/system.windows.forms.methodinvoker.aspx

于 2011-04-15T21:13:20.627 に答える