2012-05-09 12 views
4

データサービスを初期化するビューモデルでコンストラクタを使用できますか? (私は間違ってはいない、私のデータサービスは、データストレージのWebサービスにアクセスしている)このような何か(私はViewLoaderによってスローされた例外を取得するために質問 "ViewModelをロードできませんでした..." )...全体の例外を示しています。ViewModelのコンストラクタ

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Collections.ObjectModel; 
    using Cirrious.MvvmCross.ViewModels; 
    using Cirrious.MvvmCross.Commands; 
    using MobSales.Logic.DataService; 
    using MobSales.Logic.Base; 
    using MobSales.Logic.Model; 

    namespace MobSales.Logic.ViewModels 
    { 
     public class CustomersViewModel:MvxViewModel 
     { 
      ICustomerService custService; 
     public CustomersViewModel(ICustomerService custService) 
     { 
      this.custService = custService; 
      if (custService != null) 
      { 
       custService.LoadCustomerCompleted += new EventHandler<CustomerLoadedEventArgs>(custService_LoadCustomerCompleted); 
      } 
      loadCustomerCommand = new MvxRelayCommand(LoadCustomer); 
      loadCustomerCommand.Execute(); 
     } 


    private ObservableCollection<Customer> customers; 

    public ObservableCollection<Customer> Customers 
    { 
     get { return customers; } 
     set 
     { 
      customers = value; 
      FirePropertyChanged("Customers"); 
     } 
    } 


    private CustomerViewModel customer; 

    public CustomerViewModel Customer 
    { 
     get { return customer; } 
     set 
     { 
      customer = value; 
      FirePropertyChanged("Customer"); 
     } 
    } 


    private MvxRelayCommand loadCustomerCommand; 

    public MvxRelayCommand LoadCustomerCommand 
    { 
     get { return loadCustomerCommand; } 
    } 

    public void LoadCustomer() 
    { 
     custService.LoadCustomer(); 
    } 

    void custService_LoadCustomerCompleted(object sender, CustomerLoadedEventArgs e) 
    { 
     if (e.Error != null) 
     { 
      return; 
     } 

     List<Customer> loadedCustomers = new List<Customer>(); 
     foreach (var cust in e.Customers) 
     { 
      loadedCustomers.Add(new Customer(cust)); 
     } 

     Customers = new ObservableCollection<Customer>(loadedCustomers); 
    } 

} 

いっぱい例外です:Cirrious.MvvmCross.Exceptions.MvxException:ロケータMvxDefauからタイプMobSales.Logic.ViewModels.CustomersViewModelのためのViewModelをロードできませんでした...

ViewからViewModelへのバインドは、私がこの投稿に投稿したように実現されます:MVVMCross Bindings in Android

ありがとう!

+0

ViewModelsについて私が理解していることは、実際にデータを取得することとは何の関係も持た​​ないということです。 – Styxxy

+1

はい、そうです。私のデータサービスを承認するだけです。データを取得することは他のどこかで起こります。あなたが見ることができます、私は完了をロードするためのイベントがあります... – Martin

+1

ViewModelでそれが起こらない場合、あなたのViewModelはなぜこのデータサービスを持っている必要がありますか? – Styxxy

答えて

5

MvvmCrossの特筆すべき機能の1つは、デフォルトでは、ViewModelのコンストラクタパラメータをナビゲーションメカニズムの一部として使用することです。

これは、基本的な考え方は、HomeViewModelを用いたナビゲーション要求したときということですPassing on variables from ViewModel to another View (MVVMCross)

に私の答えを例に説明します

private void DoSearch() 
{ 
    RequestNavigate<TwitterViewModel>(new { searchTerm = SearchText }); 
} 

を、これはTwitterViewModelを用いて構築されることになります検索語は、コンストラクタに渡さ:現時点では

public TwitterViewModel(string searchTerm) 
{ 
    StartSearch(searchTerm); 
} 

、これは意味ごとにそのViewModelには、パラメータを持たない、または文字列パラメータがのpublicコンストラクタが必要です。

あなたのViewModelがロードされない理由は、MvxDefaultViewModelLocatorがViewModelに適したコンストラクタを見つけられないためです。 「サービス」は、


、MvvmCrossフレームワークは最も容易GetService<IServiceType>()拡張メソッドを使用してアクセスすることができる単純なIOCコンテナを提供します。例えば、中にビューモデルのTwitter sample一つが含まれています。あなたの好みは、いくつかの他のIoCを使用する場合は同様に

public class TwitterViewModel 
    : MvxViewModel 
    , IMvxServiceConsumer<ITwitterSearchProvider> 
{ 
    public TwitterViewModel(string searchTerm) 
    { 
     StartSearch(searchTerm); 
    } 

    private ITwitterSearchProvider TwitterSearchProvider 
    { 
     get { return this.GetService<ITwitterSearchProvider>(); } 
    } 

    private void StartSearch(string searchTerm) 
    { 
     if (IsSearching) 
      return; 

     IsSearching = true; 
     TwitterSearchProvider.StartAsyncSearch(searchTerm, Success, Error); 
    } 

    // ... 
} 

は、あなたが会議サービスデータがConference BaseViewModel


で消費されるかを確認することができますコンテナ、またはあなたのViewModels用の他の構築メカニズムを使用すると、MvvmCross内のViewModel構築をオーバーライドできます。

これを行う方法のアイデアを、この質問(と回答)を見てみましょう - How to replace MvxDefaultViewModelLocator in MVVMCross application

を例えばその場合は、その質問のMyViewModelLocatorの例を調整して、サービスでViewModelを構築するのはかなり簡単です。

+0

(これを複数回読んだ後)を理解してください。だから私はMVVMのViewModelsのコンストラクタを使用しません。私はそれを得た場合は、コンストラクタは、データを渡す目的のためだけで、文字列です。 – Martin

+0

MvvmCrossはい、これはデフォルトの動作ですが、別の動作が必要な場合はデフォルトを上書きするのが簡単です - あなたのアプリケーションに最適なコードを書く: – Stuart

+0

いいえ、私はそれらを書き換えません、私はしたくありません国際大会を離れることなく、可能な限り携帯性と再利用性を備えていることを確認してください。今までありがとう。 – Martin

関連する問題