0

我的演示应用程序在 WPF 项目中实现了 MVVM 模式。ViewModel 通过服务代理(代理)调用远程 Web 服务,如下所示:

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

ProjectList是 ViewModel 中定义的属性。它包含一个对象数组CProject。视图绑定到此属性以显示项目名称。基本上这工作正常。

但是,NullReferenceException如果我添加以下 if 语句,我会得到一个:

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

调试应用程序显示该ProjectList属性是null在调用 Web 服务之后。我只是不知道为什么。

上面的webservice调用实现如下:

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

2 回答 2

1

您正在使用该方法的异步版本。这就是为什么ProjectList在您的方法调用后属性不会立即填充的原因。

我建议您对同步和异步进行一些研究。

此外,要使其工作,请将您的 if 代码放在 lambda 表达式中(或者在服务调用完成时调用的单独回调方法中)

于 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 回答