为什么 Xamarin DatePicker Binding 导致导航失败?
Why is Xamarin DatePicker Binding causing a navigation failure?
我将 Prism 和 Autofac 与 Xamarin.Forms 4.0 和 MVVM 架构一起使用。使用 Navigation.NavigateAsync("MyPage") 可以工作,除非我使用我的 ViewModel 绑定到 Date 对象。
页面正确呈现,如果我的 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 绑定不当?
当绑定 SelectedStartDate
时,您没有初始化它,使其绑定到 null,因为您已将绑定模式设置为 "TwoWay"
.
Here你可以找到各种类型的绑定模式,引用:
Causes changes to either the source property or the target property to
automatically update the other. This type of binding is appropriate
for editable forms or other fully-interactive UI scenarios.
一个解决方案是这样的(如果你想保留 TwoWay 模式,并且不介意从默认选择开始):
private DateTime selectedStartDate = DateTime.Now;
或
将绑定模式设为 "OneWayToSource"
,这会更新绑定源而不是目标(请记住,这样您无法更改从绑定中选择日期,只有日期选择器可以)。
Updates the source property when the target property changes.
或
如果您想保留双向模式而不选择默认日期,您使用隐藏代码的方式是一个很好的解决方法。
我将 Prism 和 Autofac 与 Xamarin.Forms 4.0 和 MVVM 架构一起使用。使用 Navigation.NavigateAsync("MyPage") 可以工作,除非我使用我的 ViewModel 绑定到 Date 对象。
页面正确呈现,如果我的 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 绑定不当?
当绑定 SelectedStartDate
时,您没有初始化它,使其绑定到 null,因为您已将绑定模式设置为 "TwoWay"
.
Here你可以找到各种类型的绑定模式,引用:
Causes changes to either the source property or the target property to automatically update the other. This type of binding is appropriate for editable forms or other fully-interactive UI scenarios.
一个解决方案是这样的(如果你想保留 TwoWay 模式,并且不介意从默认选择开始):
private DateTime selectedStartDate = DateTime.Now;
或
将绑定模式设为 "OneWayToSource"
,这会更新绑定源而不是目标(请记住,这样您无法更改从绑定中选择日期,只有日期选择器可以)。
Updates the source property when the target property changes.
或
如果您想保留双向模式而不选择默认日期,您使用隐藏代码的方式是一个很好的解决方法。