Xamarin Forms中Entry的Unfocused事件触发ReactiveUI命令如何配置?
问题原因
你使用的ReactiveCommand.Create<FocusEventArgs, Unit>(ExecuteTheCommand)是带输入输出类型的泛型重载,要求传入的执行方法必须返回Unit类型,而你当前的ExecuteTheCommand返回值为void,因此触发返回类型不匹配的编译错误。
修复步骤
1. 修正ViewModel命令定义和执行方法
有两种可行的修改方案,选任意一种即可:
- 方案一:使用仅带输入参数的
ReactiveCommand.Create重载(更推荐,适合无返回值的同步命令)
public class MainPageViewModel : ReactiveObject { public MainPageViewModel() { TheTaskItem = new TaskItem { TaskID = "1", TaskName = "TheTaskName" }; // 仅指定输入参数类型,默认返回Unit,匹配void返回的执行方法 TheCommand = ReactiveCommand.Create<FocusEventArgs>(ExecuteTheCommand); } public ReactiveCommand<FocusEventArgs, Unit> TheCommand { get; } private void ExecuteTheCommand(FocusEventArgs args) { // 此处可以通过args.VisualElement判断是哪个Entry触发的Unfocused事件 var triggerEntry = args.VisualElement as Entry; if(triggerEntry != null) { // 按业务需求处理对应输入框的内容 } } private TaskItem _theTaskItem; public TaskItem TheTaskItem { get => _theTaskItem; set => this.RaiseAndSetIfChanged(ref _theTaskItem, value); } }
- 方案二:修改执行方法返回值为Unit
如果要保留双泛型的声明,只需要调整执行方法最后返回Unit.Default即可:
private Unit ExecuteTheCommand(FocusEventArgs args) { // 原有业务逻辑 return Unit.Default; }
2. 修正页面后置代码的资源泄漏问题
你当前的InvokeCommand调用没有加入激活生命周期托管,会导致内存泄漏,需要补充DisposeWith:
this.WhenActivated(disposable => { this.Bind(ViewModel, vm => vm.TheTaskItem.TaskID, page => page.EntryTaskID.Text) .DisposeWith(disposable); this.Bind(ViewModel, vm => vm.TheTaskItem.TaskName, page => page.EntryTaskName.Text) .DisposeWith(disposable); // 补充DisposeWith托管订阅生命周期 EntryTaskName.Events().Unfocused.InvokeCommand(ViewModel, vm => vm.TheCommand) .DisposeWith(disposable); // 如果需要TaskID输入框失焦也触发命令,加下面这行即可 EntryTaskID.Events().Unfocused.InvokeCommand(ViewModel, vm => vm.TheCommand) .DisposeWith(disposable); });
内容的提问来源于stack exchange,提问作者VinceL
相关产品推荐
相关产品推荐

