为什么Xamarin DatePicker绑定会导致导航失败?

时间:2019-07-17 19:04:24

标签: xamarin binding datepicker navigation prism

我将Prism和Autofac与具有MVVM架构的Xamarin.Forms 4.0一起使用。除非我使用ViewModel绑定到Date对象,否则使用Navigation.NavigateAsync(“ MyPage”)即可。

页面正确呈现,如果我的DatePicker没有绑定,我将导航到该页面。

<DatePicker x:Name="ProcessStartDate" Format="D" MinimumDate="01/01/2000"  />

但是以下情况会使我永远无法导航到页面。

<DatePicker x:Name="ProcessStartDate" Format="D" MinimumDate="01/01/2000" Date="{Binding SelectedStartDate, Mode=TwoWay}"

视图模型MyVM中的属性如下所示。

private DateTime selectedStartDate;
public DateTime SelectedStartDate
{
    get
    {
        return selectedStartDate;
    }
    set
    {
        SetProperty(ref selectedStartDate, value);
        sample.ProcessStartDate = value;
    }
}

使用以下代码进行导航会因上述XAML中的绑定而失败:

INavigationResult status;
try
{
    var parameters = new NavigationParameters();
    parameters.Add("CurrentSample", SelectedSample);

    status = await NavigationService.NavigateAsync("MyPage", parameters); //MyPage is registered with MyVM

}
catch (Exception ex)
{
    string mess = ex.Message;
}

我的解决方法是将事件处理程序添加到后台代码中。

<DatePicker x:Name="ProcessStartDate" Format="D" MinimumDate="01/01/2000" DateSelected="OnStartDateSelected"

所以现在我的后台代码有一个处理程序:

void OnStartDateSelected(object sender, DateChangedEventArgs args)
{
    SampleDetailsViewModel vm = BindingContext as SampleDetailsViewModel;
    vm.SelectedStartDate = args.NewDate;
}

我对此页面有解决方法,但是我不想将代码放在后面的代码中。这违反了我设法在应用程序的其他七个页面上维护的MVVM标准。我是否与DatePicker绑定不正确?

1 个答案:

答案 0 :(得分:0)

绑定SelectedStartDate时,您没有初始化它,使其绑定到 null ,因为您已将Binding Mode设置为 "TwoWay"

Here,您可以找到各种类型的绑定模式,并引用:

  

导致对源属性或目标属性的更改   自动更新其他。这种绑定是合适的   用于可编辑表单或其他完全交互的UI方案。

一种解决方案将是这样的(如果您想保持双向模式,并且不介意从默认选项开始):

private DateTime selectedStartDate = DateTime.Now;

将绑定模式设置为 "OneWayToSource" ,这将对绑定源(而不是目标)进行更新(请记住,这种方式无法从绑定中更改所选日期,只有datepicker可以)。

  

当目标属性更改时更新源属性。

如果您想保持双向模式并且没有选择默认日期,那么使用隐藏代码的方法是一个不错的解决方法。