我的演示应用程序在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);
}
答案 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);
}
我不知道这是不是一个好的编程风格,但它有效: - )