xamarin - 为什么 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 绑定不当?
解决方案
当 Binding 时SelectedStartDate
,您没有初始化它,使其绑定到null,因为您已将 Binding Mode 设置为"TwoWay"
。
在这里您可以找到各种类型的绑定模式,引用:
导致对源属性或目标属性的更改自动更新另一个。这种类型的绑定适用于可编辑的表单或其他完全交互的 UI 场景。
一个解决方案是这样的(如果你想保持 TwoWay 模式,并且不介意从默认选择开始):
private DateTime selectedStartDate = DateTime.Now;
或者
将绑定模式设置为"OneWayToSource"
,这会在没有目标的情况下更新绑定源(请记住,这样您不能从绑定中更改选定的日期,只有 datepicker 可以)。
当目标属性更改时更新源属性。
或者
如果您想保持双向模式并且没有选择默认日期,那么您使用代码背后的方式是一个很好的解决方法。
推荐阅读
- python - 按字母和数字顺序对数据框列进行排序
- php - 在单个产品页面上显示特定产品属性 (WooCommerce)
- java - 如何将整个文件写入缓冲的字符流而不是逐行写入?
- psql - 使用变量的pgpass文件?
- javascript - 如何使用css在显示和关闭时为弹出窗口设置动画?
- c - 什么会导致 gdb 不在断点处停止?
- javascript - 向页面添加延迟加载
- javascript - 对雪花中的数组进行组合、重复数据删除和排序
- python - 没有为 Google 搜索打印标题和链接
- android - 在 Box 中使用 Modifier.fillMaxHeight() 不显示元素