MVVM Community Toolkit .NET MAUI中NotifyCanExecuteChangedFor无法触发命令
解决.NET MAUI TimePicker TimeSelectedCommand不触发的问题
问题根源
你当前仅绑定了TimePicker的Time属性,但未将时间变更事件与TimeSelectedCommand关联,也没有在属性值变化时主动触发命令。
方案一:直接在XAML中绑定命令
修改XAML,给每个TimePicker添加Command绑定,让时间变化时自动触发命令:
<Border Style="{StaticResource TimePickerBorderStyle}"> <TimePicker Style="{StaticResource TimePickerStyle}" Time="{Binding StartTime}" Command="{Binding TimeSelectedCommand}" /> </Border> <Border Grid.Column="2" Style="{StaticResource TimePickerBorderStyle}"> <TimePicker Time="{Binding EndTime}" Style="{StaticResource TimePickerStyle}" Command="{Binding TimeSelectedCommand}" /> </Border>
方案二:利用ObservableProperty的变更回调(推荐)
借助CommunityToolkit.Mvvm的ObservableProperty特性,重写属性变更后的回调方法,主动调用命令:
[ObservableProperty] [NotifyCanExecuteChangedFor(nameof(TimeSelectedCommand))] TimeSpan startTime; [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(TimeSelectedCommand))] TimeSpan endTime; // StartTime变更时触发命令 partial void OnStartTimeChanged(TimeSpan value) { TimeSelectedCommand.Execute(null); } // EndTime变更时触发命令 partial void OnEndTimeChanged(TimeSpan value) { TimeSelectedCommand.Execute(null); } [RelayCommand] private void TimeSelected() { // TimeSpan是值类型,无需判空 if (StartTime < EndTime) { Preview.NumberOfSelectedIntervals = (int)(EndTime.Hours - StartTime.Hours); } }
补充:原代码中
StartTime != null && EndTime != null的判断多余,因为TimeSpan是值类型永远不会为null。
方案三:使用EventToCommandBehavior(精准控制触发时机)
如果需要只在用户确认时间选择时触发命令,可借助MAUI Toolkit的行为绑定TimeChanged事件:
<!-- 先添加命名空间 xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit" --> <Border Style="{StaticResource TimePickerBorderStyle}"> <TimePicker Style="{StaticResource TimePickerStyle}" Time="{Binding StartTime}"> <TimePicker.Behaviors> <toolkit:EventToCommandBehavior EventName="TimeChanged" Command="{Binding TimeSelectedCommand}" /> </TimePicker.Behaviors> </TimePicker> </Border> <Border Grid.Column="2" Style="{StaticResource TimePickerBorderStyle}"> <TimePicker Time="{Binding EndTime}" Style="{StaticResource TimePickerStyle}"> <TimePicker.Behaviors> <toolkit:EventToCommandBehavior EventName="TimeChanged" Command="{Binding TimeSelectedCommand}" /> </TimePicker.Behaviors> </TimePicker> </Border>
内容的提问来源于stack exchange,提问作者Cristi Sandu
相关产品推荐
相关产品推荐

