在我的Xamarin.Forms项目(带有Prism,Android)中,我试图将EventToCommandBehavior实现到DatePicker以及TimePicker,以便传输所选值。 XAML看起来像这样:
<DatePicker x:Name="DatePicker"
Format="D"
HorizontalOptions="CenterAndExpand"
Margin="60, 0, 60, 0">
<DatePicker.Behaviors>
<b:EventToCommandBehavior EventName="DateSelected"
Command="{Binding DateSelectedCommand}"
EventArgsConverter="{StaticResource DateSelectedConv}"/>
</DatePicker.Behaviors>
</DatePicker>
<TimePicker x:Name="TimePicker"
HorizontalOptions="CenterAndExpand"
Margin="60, 0, 60, 0">
<TimePicker.Behaviors>
<b:EventToCommandBehavior EventName="TimeChanged"
Command="{Binding TimeSelectedCommand}"
EventArgsConverter="{StaticResource TimeSelectedConv}">
</b:EventToCommandBehavior>
</TimePicker.Behaviors>
</TimePicker>
在此SettingsPage的ViewModel中,
public ICommand DateSelectedCommand { get; set; }
public ICommand TimeSelectedCommand { get; set; }
private void NotifyDateSelected(DateTime date)
{
MessagingCenter.Send<SettingsPageViewModel, DateTime>(this, "dateChanged", date);
}
private void NotifyTimeSelected(TimeSpan timeSpan)
{
MessagingCenter.Send<SettingsPageViewModel, TimeSpan>(this, "timeChanged", timeSpan);
}
TimeSelectedConverter的Convert方法是
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var eventArgs = value as TimeChangedEventArgs;
if (eventArgs == null)
throw new ArgumentException("Expected TimeChangedEventArgs as value", "value");
return new TimeSpan(eventArgs.HourOfDay, eventArgs.Minute, 0);
}
正在使用的OverviewPage的ViewModel订阅
MessagingCenter.Subscribe<SettingsPageViewModel, DateTime>(this, "dateChanged",
(settingsPageViewModel, date) =>
{
Update();
});
MessagingCenter.Subscribe<SettingsPageViewModel, TimeSpan>(this, "timeChanged",
(settingsPageViewModel, timeSpan) =>
{
Update();
});
这对于DatePicker可以正常工作。但是,一旦将EventToCommandBehavior添加到TimePicker,应用程序就会崩溃。也许TimePicker不支持行为?