Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在WPF应用程序中调用webservice后,属性为NULL_Wpf_Web Services_Mvvm_Callback - Fatal编程技术网

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

在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

我的演示应用程序在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();
调试应用程序表明,调用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),并防止用户重复触发操作(例如禁用按钮等)。是的,感谢您的提示。这些东西已经是列表中的下一个:-)