2011-02-01 110 views
0

我最近觀看了John Papa的Service Patterns with SL from SL Firestarter 2010,它描述了MVVM Light中的一個服務模式,我正在嘗試實現它。我將描述下面的過程,但首先要說明的是,我已經能夠讓我的「設計時間」數據毫無問題地工作。我無法弄清楚的是我的運行時數據。不幸的是,我的客戶使用老派的.asmx網絡服務卡住了,我的雙手被綁在這一塊上。MVVM Web服務數據在設計時間和運行時間

在我的ViewModel中,我調用了IAccountService,這是我用一個方法設置的接口:GetAccounts。從這裏,我使用ServiceProviderBase類來確定調用是來自designtime還是runtime。當我從設計時調用此方法時,我加載了一個DesignAccountService,它使用DesignAccount Model來填充假數據,最終顯示在我的Gridview中。它有效,我很興奮。

當我從運行時調用GetAccounts方法時,。這裏的數據庫人員編寫並測試了一個將數據返回到數據表的Web服務,然後將其轉換爲ObservableCollection。此Web服務正在解決方案的Web項目中運行。我試圖調用從我的SL項目該Web服務&搶觀察集合......好了,所以代碼:

在我的ViewModel:

protected TSMVVM.Services.IAccountService AccountService { get; set; } 

    public AccountDefinitionViewModel(TSMVVM.Services.IAccountService accountService) 
    { 
     AccountService = accountService; 
     LoadData(); 
    } 
    public void LoadData() 
    { 
     LoadAccounts(); 
    } 
    public void LoadAccounts() 
    { 
     Accounts = null; 
     AccountService.GetAccounts(GetAccountsCallback); 
    } 
    private void GetAccountsCallback(ObservableCollection<TSMVVM.Model.P.P_ACCOUNTS> accounts) 
    { 
     if (accounts != null) 
     { 
      this._accounts = accounts; 
      if (_accounts.Count > 0) 
      { 
       SelectedAccount = Accounts[0]; 
      } 
     } 
    } 
    private ObservableCollection<TSMVVM.Model.P.P_ACCOUNTS> _accounts; 
    public ObservableCollection<TSMVVM.Model.P.P_ACCOUNTS> Accounts 
    { 
     get { return _accounts; } 
     set 
     { 
      _accounts = value; 
      RaisePropertyChanged("Accounts"); 
     } 
    } 

接口:

public interface IAccountService 
{ 
    void GetAccounts(Action<ObservableCollection<TSMVVM.Model.P.P_ACCOUNTS>> getAccountsCallback); 
} 

AccountService

 private ObservableCollection<TSMVVMCommonSVC.TSAccount> _account = new ObservableCollection<TSMVVMCommonSVC.TSAccount>(); 
    private TSMVVMCommonSVC.CommonSoapClient CommonService; 
    private Action<ObservableCollection<TSMVVMCommonSVC.TSAccount>> _getAccountsCallback; 

    public AccountService() 
    { 
    } 
    public void GetAccounts(Action<ObservableCollection<TSMVVM.Model.P.P_ACCOUNTS>> getAccountsCallback) 
    { 
     _getAccountsCallback = getAccountsCallback; 
     Uri iSilverlightServiceUriRelative = new Uri(App.Current.Host.Source, "../Services/Common.asmx"); 
     EndpointAddress iSilverlightServiceEndpoint = new EndpointAddress(iSilverlightServiceUriRelative); 
     BasicHttpBinding iSilverlightServiceBinding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);// Transport if it's HTTPS:// 
     CommonService = new TSMVVMCommonSVC.CommonSoapClient(iSilverlightServiceBinding, iSilverlightServiceEndpoint); 
     CommonService.GetAccountCollectionCompleted +=new EventHandler<TSMVVMCommonSVC.GetAccountCollectionCompletedEventArgs>(CommonService_GetAccountCollectionCompleted); 
     CommonService.GetAccountCollectionAsync(); 
    } 
    private void CommonService_GetAccountCollectionCompleted(object sender,TSMVVMCommonSVC.GetAccountCollectionCompletedEventArgs e) 
    { 
     if (e.Result.Length > 0) 
     { 
      foreach (TSMVVMCommonSVC.TSAccount item in e.Result) { 
       var acct = new TSMVVM.Model.P.P_ACCOUNTS() { 
        ACCOUNT_NUMBER = item.AccountNumber, 
        DESCRIPTION = item.AccountDescription 
       }; 
       _account.Add(acct); 
      } 
     } 
     _getAccountsCallback(_account); 
    } 

現在,如果我在我的Vie中放置了一個斷點wModel在GET帳戶(設置爲返回_accounts),帳戶被設置爲包含315項的項目集合。如果我深入瞭解該集合,我可以看到數據從我的Web服務成功返回。事實上,在此斷點,如果我一頭扎進我的XAML(代碼功能幾乎相同在DataGrid,而不是一個Telerik的控制),

 <telerik:RadGridView ItemsSource="{Binding Accounts}" 
           SelectedItem="{Binding SelectedAccount, Mode=TwoWay}" 
           AutoGenerateColumns="False"> 
     <telerik:RadGridView.Columns> 
      <telerik:GridViewDataColumn DataMemberBinding="{Binding Path=ACCOUNT_NUMBER}" Header="Account Number" /> 
      <telerik:GridViewDataColumn DataMemberBinding="{Binding Path=DESCRIPTION}" Header="Description" /> 
     </telerik:RadGridView.Columns> 

    </telerik:RadGridView> 

具有斷點設置,我可以看到帳戶變量,在我ItemsSource綁定,設置爲315個項目的集合。但是,網格是空的。我知道我的列綁定綁定到正確的項目,但我無法弄清楚從哪裏去。

+0

你可以向我們展示代碼,在哪裏將View和ViewModel綁定在一起? – Euphoric 2011-02-01 06:14:48

+0

就像更多的FYI一樣 - 我使用ViewModelLocator,它是MVVMLight工具包的一部分。由於我的設計時間數據正在工作,這絕對具有約束力。 – 2011-02-01 19:17:01

回答

2

更改此代碼:

if (accounts != null) 
    { 
     this._accounts = accounts; 

if (accounts != null) 
    { 
     this.Accounts = accounts; 

因爲的PropertyChanged沒有在第一碼解僱,UI不知道任何變化的情況下。