为什么 Xamarin 日期选取器绑定会导致导航失败?



我正在使用带有MVVM架构的Xamarin.Forms 4.0的Prism和Autofac。使用 Navigation.NavigateAsync("MyPage") 工作,除非我使用我的 ViewModel 绑定到 Date 对象。

页面正确呈现,如果我的日期选择器没有绑定,我会导航到它。

<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 标准。 我是否与日期选取器绑定不正确?

绑定SelectedStartDate时,您不会对其进行初始化,而是将其绑定为null,因为您已将绑定模式设置为"TwoWay"

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

导致对源属性或目标属性的更改 自动更新另一个。这种类型的绑定是合适的 适用于可编辑窗体或其他完全交互式的 UI 方案。

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

private DateTime selectedStartDate = DateTime.Now;

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

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

如果要保留双向模式并且未选择默认日期,则使用代码隐藏的方式是一个很好的解决方法。

相关内容

  • 没有找到相关文章

最新更新