在WPF应用程序中调用webservice后,属性为NULL

时间:2013-01-15 15:12:33

标签: wpf web-services mvvm callback

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

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

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

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

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

在调用webservice之后,调试应用程序会显示ProjectList属性为null。我只是不知道为什么。

上面的webservice调用实现如下:

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

2 个答案:

答案 0 :(得分:1)

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

我建议你研究一下同步和异步。

另外,为了使这项工作,将你的if代码放在lambda表达式中(或者在服务调用完成时调用一个单独的回调方法)

答案 1 :(得分: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);
}

我不知道这是不是一个好的编程风格,但它有效: - )