我想用我的silverlight應用程序調用wcf服務,並且在理解模型如何將結果返回給視圖模型時遇到了一些麻煩。在我的視圖模型我有以下命令:在Silverlight中使用mvvm進行異步調用
public DelegateCommand GetSearchResultCommand
{
get
{
if (this._getSearchResultCommand == null)
this._getSearchResultCommand = new DelegateCommand(GetSearchResultCommandExecute, CanGetSearchResultsCommandExecute);
return this._getSearchResultCommand;
}
}
private void GetSearchResultCommandExecute(object parameter)
{
this.SearchResults = this._DataModel.GetSearchResults(this.SearchTerm);
}
/// <summary>
/// Bindable property for SearchResults
/// </summary>
public ObservableCollection<QueryResponse> SearchResults
{
get
{
return this._SearchResults;
}
private set
{
if (this._SearchResults == value)
return;
// Set the new value and notify
this._SearchResults = value;
this.NotifyPropertyChanged("SearchResults");
}
}
然後我的模型中,我有以下代碼
public ObservableCollection<QueryResponse> GetSearchResults(string searchQuery)
{
//return type cannot be void needs to be a collection
SearchClient sc = new SearchClient();
//******
//TODO: stubbed in placeholder for Endpoint Address used to retreive proxy address at runtime
// sc.Endpoint.Address = (clientProxy);
//******
sc.QueryCompleted += new EventHandler<QueryCompletedEventArgs>(sc_QueryCompleted);
sc.QueryAsync(new Query { QueryText = searchQuery });
return LastSearchResults;
}
void sc_QueryCompleted(object sender, QueryCompletedEventArgs e)
{
ObservableCollection<QueryResponse> results = new ObservableCollection<QueryResponse>();
results.Add(e.Result);
this.LastSearchResults = results;
}
當我插入模式,我看到正在執行的查詢和內斷點結果在模型中返回(this.LastSearchResults =結果),但我似乎無法得到此集合來更新/通知結果的視圖模型。我已經生成並運行了一個類似的測試,只使用了一個方法和虛擬類,它似乎工作,所以我懷疑這個問題是由於異步調用/線程。我在ViewModel中有INotifyPropertyChanged來同步View和ViewModel。我是否也需要在模型中實現INotifyPropChng?我是mvvm的新手,所以對於我應該如何處理這個問題的任何幫助/例子都會很感激。
謝謝
UPDATE 在進一步的測試中,我加入INotifyPropertyChanged的模型並改變Completed事件如下:
void sc_QueryCompleted(object sender, QueryCompletedEventArgs e)
{
ObservableCollection<QueryResponse> results = new ObservableCollection<QueryResponse>();
results.Add(e.Result);
//this.LastSearchResults = results;
SearchResults = results;
}
在搜索結果我現在看到它是放置手錶更新了WCF的結果。我的問題仍然是這個正確的方法嗎?它似乎現在工作,但我很好奇,如果我失去了其他東西,或者如果我不應該在模型中放置INotify。
謝謝
感謝喬,在看着這個我認爲那麼命令(我如何調用搜索)保持不變,與我的委託指令?主要的變化是在模型中引用創建的服務接口? – rlcrews 2011-05-10 15:10:13
這是對的,而不是我創建的公共Search()方法,您仍然可以使用您的搜索命令。 – 2011-05-10 15:53:54
這是一個很好的迴應。即使你沒有爲Silverlight做Async,將通信抽象爲服務層也是我的首選方法。這也使得多個ViewModel更容易使用相同的服務,並使服務層模擬更加簡單。 – 2011-05-11 14:32:44