2017-07-05 16 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

相关问题