首页 > 解决方案 > 为什么 Xamarin DatePicker 绑定会导致导航失败?

问题描述

我将 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 绑定不当?

标签: xamarinbindingdatepickernavigationprism

解决方案


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

在这里您可以找到各种类型的绑定模式,引用:

导致对源属性或目标属性的更改自动更新另一个。这种类型的绑定适用于可编辑的表单或其他完全交互的 UI 场景。

一个解决方案是这样的(如果你想保持 TwoWay 模式,并且不介意从默认选择开始):

private DateTime selectedStartDate = DateTime.Now;

或者

将绑定模式设置为"OneWayToSource",这会在没有目标的情况下更新绑定源(请记住,这样您不能从绑定中更改选定的日期,只有 datepicker 可以)。

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

或者

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


推荐阅读