2013-01-15 30 views
0

我的演示應用程序在WPF項目中實現了MVVM模式。在ViewModel經由服務代理(代理)這樣調用遠程web服務:在WPF應用程序中調用webservice後,屬性爲NULL

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

ProjectList是在視圖模型中定義的屬性。它包含一組CProject對象。該視圖綁定到此屬性以顯示項目名稱。基本上這工作正常。

不過,我得到一個NullReferenceException如果我添加下面的if語句:

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

調試應用表明,該ProjectList屬性是null的Web服務調用後。我只是不知道爲什麼。

的Web服務調用上面實現如下:

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

在調用webservice之前是'ProjectList'' null'嗎? –

+0

是的。該屬性最初通過調用webservice進行設置。有趣的是:綁定到'ProjectList'的UI中的控件被正確填充。 –

回答

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(); 
    } 
} 

調用在一個單獨的服務代理的實際WebService操作:

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

我不知道這是一種很好的編程風格,但它的工作原理:-)

+1

是的,這實際上是一種以異步的方式來做到這一點。從而確保您的應用程序(UI)在等待服務調用時不會凍結。但是,請注意,您現在需要確保UI保持在讓用戶知道應用程序實際上正在執行某些操作(例如BusyIndi​​cator)的狀態,並且還要防止用戶反覆觸發操作(例如禁用按鈕和東西) –

+0

是的,謝謝你的提示。這些東西已經在列表上:-) –

1

您使用該方法的異步版本。這就是爲什麼在您的方法調用後ProjectList屬性不會立即填充。

我建議你研究一下關於同步和異步。

此外,爲了使這項工作,將lambda表達式內你如果代碼(或以其他方式在一個單獨的回調方法被調用完成服務呼叫時)

相關問題