在WPF应用程序中调用webservice后,属性为NULL
我的演示应用程序在WPF项目中实现了MVVM模式。ViewModel通过服务代理(代理)调用远程Web服务,如下所示:在WPF应用程序中调用webservice后,属性为NULL,wpf,web-services,mvvm,callback,Wpf,Web Services,Mvvm,Callback,我的演示应用程序在WPF项目中实现了MVVM模式。ViewModel通过服务代理(代理)调用远程Web服务,如下所示: proxy.GetProjectList((sender, e) => this.ProjectList, username, password); ProjectList是在ViewModel中定义的属性。它包含一个CProject对象数组。视图绑定到此属性以显示项目名称。基本上这很好用 但是,如果我添加以下if语句,我会得到一个NullReferenceExcept
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();
调试应用程序表明,调用Web服务后,ProjectList
属性为null
。我只是不知道为什么
上面的webservice调用实现如下:
public void GetProjectList(EventHandler<getProjectListCompletedEventArgs> callback, string username, string password) {
proxy.getProjectListCompleted += callback;
proxy.getProjectListAsync(username, password);
}
public void GetProjectList(EventHandler回调、字符串用户名、字符串密码){
proxy.getProjectListCompleted+=回调;
getProjectListAsync(用户名、密码);
}
您正在使用该方法的异步版本。这就是为什么方法调用后不会立即填充ProjectList
属性的原因
我建议你研究一下同步和异步
此外,为了实现这一点,请将if代码放在lambda表达式中(或者放在服务调用完成时要调用的单独回调方法中)按照我将实现更改为以下的提示进行操作
从客户端调用操作:
proxy.GetProjectList(GetProjectListCallback, Username, SecurePassword);
private void GetProjectListCallback(object sender, getProjectListCompletedEventArgs e) {
ProjectList = e.Result;
if (ProjectList != null) {
if (ProjectList.Length > 0) doSomething();
}
}
public void GetProjectList(getProjectListCompletedEventArgs callback, string username, SecureString password) {
proxy.getProjectListCompleted += callback;
proxy.getProjectListAsync(username, password);
}
在之前添加回调方法:
proxy.GetProjectList(GetProjectListCallback, Username, SecurePassword);
private void GetProjectListCallback(object sender, getProjectListCompletedEventArgs e) {
ProjectList = e.Result;
if (ProjectList != null) {
if (ProjectList.Length > 0) doSomething();
}
}
public void GetProjectList(getProjectListCompletedEventArgs callback, string username, SecureString password) {
proxy.getProjectListCompleted += callback;
proxy.getProjectListAsync(username, password);
}
在单独的服务代理中调用实际的webservice操作:
proxy.GetProjectList(GetProjectListCallback, Username, SecurePassword);
private void GetProjectListCallback(object sender, getProjectListCompletedEventArgs e) {
ProjectList = e.Result;
if (ProjectList != null) {
if (ProjectList.Length > 0) doSomething();
}
}
public void GetProjectList(getProjectListCompletedEventArgs callback, string username, SecureString password) {
proxy.getProjectListCompleted += callback;
proxy.getProjectListAsync(username, password);
}
我不知道这是否是一种好的编程风格,但它是有效的:-)在调用Web服务之前是
ProjectList
null
吗?是的。此属性最初是通过调用webservice设置的。有趣的是:UI中绑定到ProjectList
的控件被正确填充。是的,这实际上是一种异步方式。因此,确保您的应用程序(UI)在等待服务调用时不会冻结。但是,请注意,您现在需要确保UI保持一种状态,让用户知道应用程序正在实际执行某些操作(例如BusyIndicator),并防止用户重复触发操作(例如禁用按钮等)。是的,感谢您的提示。这些东西已经是列表中的下一个:-)