2017-07-05 13 views
0

我正在嘗試使用MvxDialogFragment來顯示活動的數據綁定對話框。我的對話視圖模型如下:什麼是顯示MvxDialogFragment的簡單方法?

public class ContainerDialogViewModel : MvxViewModel 
{ 

    public string ShipperName; 

    public void Init(string Name) 
    { 
     ShipperName = Name; 
     LoadData(); 
    } 

    public void LoadData() 
    { 
     Survey = SurveyDataSource.CurrSurvey; 
    } 

    private ShipmentSurvey _Survey; 
    public ShipmentSurvey Survey 
    { 
     get 
     { 
      return _Survey; 
     } 
     set 
     { 
      _Survey = value; 
      RaisePropertyChanged(() => Survey); 
      RaisePropertyChanged(() => Containers); 
     } 
    } 


    public List<ShipmentSurveyContainer> Containers 
    { 
     get 
     { 
      if (Survey == null) 
       return new List<ShipmentSurveyContainer>(); 
      else 
       return Survey.SurveyContainers.ToList(); 
     } 
    } 

} 

的MvxDialogFragment編碼如下:

public class ContainerDialog : MvxDialogFragment<ContainerDialogViewModel> 
{ 
    public override Dialog OnCreateDialog(Bundle savedState) 
    { 
     base.EnsureBindingContextSet(savedState); 

     this.BindingInflate(Resource.Layout.ContainerDialog, null); 

     return base.OnCreateDialog(savedState); 
    } 

} 

在我的活動,我想弄清楚啓動對話的最簡單方法。這是我曾嘗試:

public class SurveyView : MvxActivity 
{ 
    public void ShowContainerDialog() 
    { 
     ContainerDialogViewModel vm = new ViewModels.ContainerDialogViewModel(); 
     vm.Init("Test Name"); 
     var dialogFragment = new ContainerDialog() 
     { 
      DataContext = vm 
     }; 
     dialogFragment.Show(FragmentManager, "Containers"); 
    } 
} 

我敢肯定,我創建視圖模型的方法是非正統的,但我不知道另一種方式來做到這一點。最大的問題是FragmentManager被轉換爲錯誤的版本。 Show正在尋找一個Android.Support.V4.App.FragmentManager,並且暴露的FragmentManager是一個Android.App.FragmentManager。我嘗試將MvxActivity更改爲MvxFragmentActivity,但這似乎沒有幫助。有人能指引我朝着正確的方向嗎?

+0

支持對話框的新主持人計劃在5.1.0 – Martijn00

+0

@ Martijn00有沒有辦法讓它現在工作?像一個自定義的演示者或類似的東西?我搜索了一個MvxDialogFragment的工作示例的高低,並且找不到一個。 –

+0

我正在處理此問題:https://github.com/MvvmCross/MvvmCross/issues/1934 – Martijn00

回答

1

MvvmCross並沒有真正支持這個,當我試圖做到這一點,但我碰到另一個我需要這個和唉,實例在那裏的功能。感謝@ Martijn00指點我的解決方案。這將是非常基本的,但我認爲這可能有助於某人。

我的佈局:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     style="@style/TableHeaderTextView" 
     android:text="Work Date"/> 
    <MvxDatePicker 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textSize="20dp" 
    local:MvxBind="Value WorkDate" /> 
    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Close" 
     local:MvxBind="Click CloseCommand" /> 
</LinearLayout> 

我的視圖模型:

public class HoursDateDialogViewModel : MvxViewModel<EstimateHours> 
{ 
    private readonly IMvxNavigationService _navigationService; 

    public HoursDateDialogViewModel(IMvxNavigationService navigationService) 
    { 
     _navigationService = navigationService; 

     CloseCommand = new MvxAsyncCommand(async() => await _navigationService.Close(this)); 
    } 

    public override System.Threading.Tasks.Task Initialize() 
    { 
     return base.Initialize(); 
    } 

    public override void Prepare(EstimateHours parm) 
    { 
     base.Prepare(); 
     Hours = parm; 
    } 

    public IMvxAsyncCommand CloseCommand { get; private set; } 

    private EstimateHours _Hours; 
    public EstimateHours Hours 
    { 
     get 
     { 
      return _Hours; 
       } 
     set 
     { 
      _Hours = value; 
      RaisePropertyChanged(() => Hours); 
      RaisePropertyChanged(() => WorkDate); 
     } 
    } 

    public DateTime WorkDate 
    { 
     get 
     { 
      return Hours.StartTime ?? DateTime.Today; 
     } 
     set 
     { 
      DateTime s = Hours.StartTime ?? DateTime.Today; 
      DateTime d = new DateTime(value.Year, value.Month, value.Day, s.Hour, s.Minute, s.Second); 
      Hours.StartTime = d; 
      DateTime e = Hours.EndTime ?? DateTime.Today; 
      d = new DateTime(value.Year, value.Month, value.Day, e.Hour, e.Minute, e.Second); 
      Hours.EndTime = d; 
      RaisePropertyChanged(() => WorkDate); 
     } 
    } 

} 

筆者認爲:

[MvxDialogFragmentPresentation] 
[Register(nameof(HoursDateDialogView))] 
public class HoursDateDialogView : MvxDialogFragment<HoursDateDialogViewModel> 
{ 
    public HoursDateDialogView() 
    { 
    } 

    protected HoursDateDialogView(IntPtr javaReference, JniHandleOwnership transfer) 
     : base(javaReference, transfer) 
    { 
    } 

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     var ignore = base.OnCreateView(inflater, container, savedInstanceState); 

     var view = this.BindingInflate(Resource.Layout.HoursDateDialogView, null); 

     return view; 
    } 
} 

這一切就是這麼簡單。我能夠傳遞一個參數對象並將對象的一部分綁定到MvxDatePicker。爲了在您的Setup.cs第一顯示此對話框,您需要:

protected override IMvxAndroidViewPresenter CreateViewPresenter() 
    { 
     return new MvxAppCompatViewPresenter(AndroidViewAssemblies); 
    } 

在您的視圖模型,從中將打開的對話框中,你需要包含一個構造函數:

private readonly IMvxNavigationService _navigationService; 

    public LocalHourlyViewModel(IMvxNavigationService navigationService) 
    { 
     _navigationService = navigationService; 
    } 

這將給導航服務,以便您可以使用它。最後,所有你需要做的打開對話框:

async() => await _navigationService.Navigate<HoursDateDialogViewModel, EstimateHours>(Item); 

我什至不知道你有等待呼叫,但我下面的例子。您可以在提供的鏈接@ Martijn00看到更多的例子:

https://github.com/MvvmCross/MvvmCross/tree/develop/TestProjects/Playground

乾杯!

0

我試圖改變MvxActivity到MvxFragmentActivity

這是正確的第一步。然後代替傳入FragmentManager,傳入SupportFragmentManager

如果你不熟悉的支持庫,你可以閱讀更多關於它們是什麼,以及如何將其與Xamarin here使用

+0

你的建議使它能夠正確編譯並運行,但是當顯示對話框時,它是空白的。它膨脹視圖,所以我不知道下一步該怎麼做。 –

+1

@JimWilcox - 而不是使用OnCreateDialog,而是重寫OnCreateView,並在那裏擴展布局。你可以擺脫OnCreateDialog。查看此代碼塊中的註釋以獲取更多信息:https://stackoverflow.com/a/19302991/2754727 – pnavk

相關問題