2016-11-03 14 views
0

MVVMCrossを使用していて、MvxDialogFragmentバインディングに問題があります。 私はCore PCLプロジェクトで解決された基本サービスを持っており、基本サービスクラスから派生したiOSとAndroidプロジェクトでカスタムサービスの実装を追加しています。アンドロイドサービスでAndroidのアクセスMvxDialogFragment view from service

私はMvxDialogFragmentインスタンスを作成し、表示さ:

var top = (MvxFragmentActivity)Mvx.Resolve<IMvxAndroidCurrentTopActivity>().Activity; 

if (top == null) 
{ 
    throw new MvxException("Cannot get current top activity"); 
} 

var dlg = new AlertDialog.Builder(top); 
dlg.Create().Show(); 

dialog = new MyDialog 
{ 
    Cancelable = false 
}; 
dialog.Show(top.SupportFragmentManager, ""); 

と私は簡単なダイアログのレイアウトを持っている:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/test_click_button" 
     android:text="Test" 
     app:MvxBind="Click TestClickCommand" /> 
</LinearLayout> 

だから私の目標は、インスタンス化されdialogFragment、から基本サービスコマンドをアクセスもすることですサービスから。どうやってやるの?

代わりに、私のボタンクリックサービスを処理したいが、私のView、ViewModelまたはDialogプロパティがnullであるため、これを行う方法が見つからない。

サービス中のクリックを処理する方法、または自己バインディングを実装する方法はありますか?

+0

あなたがサービスからのビューにアクセスしたい場合、あなたは基本的に間違ってそれをやっています。 Mvvmパターンはそれを行うために作られていません。また、「私は自分のサービスコマンドをどのViewModelにも配置したくありません」と言っています。コマンドはサービスではなく、ViewModelsにあります。 ViewModelsはサービスメソッドを呼び出します。たぶん私は全体のことを誤解している... – xleon

+0

返信いただきありがとうございます!私はその質問を編集しました。主な目標は、ダイアログフラグボタンをサービスコマンドにバインドする方法です – Fragment

答えて

0

は最終的に私はMvxDialogFragmentサブスクリプションを通じて、希望、およびサービスの注入を達成:

public class MyDialog : MvxDialogFragment 
{ 
    private ISampleService _sampleService; 

    public MyDialog(ISampleService sampleService) 
    { 
     _sampleService = sampleService; 
    } 

    public override Dialog OnCreateDialog(Bundle savedInstanceState) 
    { 
     EnsureBindingContextSet(savedInstanceState); 

     var dialog = new AlertDialog.Builder(Activity); 
     var view = this.BindingInflate(Resource.Layout.MyDialog, null); 

     view.FindViewById(Resource.Id.test_click_button).Click += (sender, e) => 
     { 
      _sampleService.TestClick(); 
      Dismiss(); 
     }; 

     dialog.SetView(view); 

     return dialog.Create(); 
    } 
}