0

私のデモ アプリケーションは、MVVM パターンを WPF プロジェクトに実装しています。ViewModel は、次のようにサービス エージェント (プロキシ) を介してリモート Web サービスを呼び出します。

proxy.GetProjectList((sender, e) => this.ProjectList, username, password);

ProjectListViewModel で定義されたプロパティです。オブジェクトの配列を保持しCProjectます。ビューはこのプロパティにバインドして、プロジェクト名を表示します。基本的にこれでうまくいきます。

ただしNullReferenceException、次のifステートメントを追加すると、次のようになります。

proxy.GetProjectList((sender, e) => this.ProjectList = e.Result, username, password);
if (ProjectList.Length > 0) doSomething();

アプリケーションをデバッグすると、Webサービスが呼び出された後にProjectListプロパティが表示されます。nullそして、私はその理由を知りません。

上記の Web サービス呼び出しは、次のように実装されます。

public void GetProjectList(EventHandler<getProjectListCompletedEventArgs> callback, string username, string password) {
  proxy.getProjectListCompleted += callback;
  proxy.getProjectListAsync(username, password);
}
4

2 に答える 2

1

メソッドの非同期バージョンを使用しています。そのため、ProjectListメソッド呼び出しの直後にプロパティが設定されません。

同期と非同期について少し調べてみることをお勧めします。

また、これを機能させるには、if コードをラムダ式内に配置します (または、サービス呼び出しが完了したときに呼び出される別のコールバック メソッド内に配置します)。

于 2013-01-15T22:56:34.960 に答える
0

HighCoreからのヒントに従って、実装を次のように変更しました。

クライアントから操作を呼び出す:

proxy.GetProjectList(GetProjectListCallback, Username, SecurePassword);

次の前にコールバック メソッドを追加します。

private void GetProjectListCallback(object sender, getProjectListCompletedEventArgs e) {
  ProjectList = e.Result;
  if (ProjectList != null) {
    if (ProjectList.Length > 0) doSomething();
  }
}

別のサービス エージェントで実際の Web サービス操作を呼び出す:

public void GetProjectList(getProjectListCompletedEventArgs callback, string username, SecureString password) {
  proxy.getProjectListCompleted += callback;
  proxy.getProjectListAsync(username, password);
}

これが良いプログラミングスタイルかどうかはわかりませんが、うまくいきます:-)

于 2013-01-16T09:20:50.420 に答える