2016-11-03 49 views
0

我正在使用MVVMCross,並且與MvxDialogFragment綁定有問題。 我有一個基礎服務,在Core PCL項目中解決,在iOS和Android項目中添加自定義服務實現,派生自基本服務類。Android訪問服務MvxDialogFragment視圖

在Android的服務,我構建和顯示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屬性爲空。

如何處理點擊服務或實現自我約束?

+0

如果你想從服務訪問視圖,你基本上是做錯了。 Mvvm模式不是爲了做到這一點。你也會說「我不想把我的服務命令放在任何viewModel中」。命令不在服務中,而是在ViewModels中。 ViewModels調用服務方法。也許我只是誤解了整個事情... – xleon

+0

感謝您的回覆!我編輯了這個問題,主要目標是:如何將dialogfragment按鈕綁定到服務命令 – 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(); 
    } 
}