2016-12-06 32 views
0

私はVS2015でXamarin.Forms Portableソリューションを使用しています。 MVVM Lightを使用してViewModelにPCLのコンテンツページをバインドしました。 ViewModelで自分のプロパティの1つを変更すると、Android、IOS、UWPのUIが更新されます。しかし、私はViewModelプロパティの更新を実現する方法がわかりません。Xamarin.DroidのMainActivityからPCL ViewModelにアクセス

私のドロイドプロジェクトMainActivityでは、アクティビティから継承したOnNewIntentを使用して、新しいインテントを登録しています。このOnNewIntentが呼び出されるとすぐに、私はViewModelのプロパティを変更したいと思っています。例えば、public string exampleです。私は単に私が、その後のViewModelの新しいインスタンスを作成し、自分のデータバインディングは、別のインスタンスを参照しているよう

ViewModel vm = new ViewModel(); 
vm.example = "Hi from Android"; 

を使用してそれを行うことはできません。では、これを行う正しい方法は何ですか?私は

public string example 
{get {%using dependency injection here to get the string from Android }} 

のように、私のViewModelのプロパティのゲッターに依存性の注入を使用して考えたが、その後、私はまた、結合がOnNewIntentがMainActivityに呼び出されたときに更新する必要があることのViewModelに通知しなければなりません。

私はこれを良い方法でどのように整理するかの提案に非常に感謝します。

答えて

0

読み込んだビューのカスタムレンダラーをコンテンツページに書き込むことで、ビューモデルを取得できます。たとえば、コンテンツページにラベルを読み込みます。そして、あなたはそのラベル用のカスタムレンダラを作成し、以下のような、

class CustomRenderer : LabelRenderer 
{ 
    public ViewModel ViewModel { get; set; } 
    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     base.OnElementPropertyChanged(sender, e); 

     var label = sender as Label; 
     if (label != null) 
     { 
      ContentPage page = label.Parent as ContentPage; 
      ViewModel = page.BindingContext as ViewModel; 
     } 
    } 
} 

としてビューモデルを取得することができますカスタムレンダラークラスの名前空間の上、以下の属性を追加することを確認してください、

[アセンブリ:ExportRendererAttribute (typeof演算(ラベル)、typeof演算(CustomRenderer))]

次に、あなただけの以下のようなようCustomRendererクラスのインスタンスを作成することにより、MainActivityに(あなたのPCLでViewModelに他ならない)というのViewModelプロパティにアクセスすることができ、

CustomRendererレンダラー= new CustomRenderer();

renderer.ViewModel.example = "XXX";

私はこの方法があなたを助けることを願っています!

0

お返事ありがとうございます。私は今このようにしました:

私はINotifyPropertyChangedを実装するPCLプロジェクトで静的クラスpublic static class MyClassを作成しました。 MainActivityの私のOnNewIntentから、public static string exampleMyClassに設定しています。このプロパティの設定では、ViewModelに気づいたPropertyChangedを呼び出しています。ここではRaisePropertyChanged("example")を使用し、ViewModelプロパティのゲッターでexampleを使用しています。get { return My Class.example; }を使用しています。ですから、基本的には、何かが変わったときにViewModelに通知するViewModelの静的モデル(またはモデル内の静的プロパティ、静的なものである必要はありません)を使用しています。同じプロパティをiOSプロジェクトまたはUWPプロジェクトから設定でき、そのUIは同じViewModelを参照します...これは良い解決策だと思いますか?

関連する問題