【发布时间】:2021-06-06 17:42:50
【问题描述】:
我在 Xamarin 表单页面中有输入字段,我想在用户完成向其中输入文本时触发 ReactiveUI 命令。我正在使用 ReactiveUI.Events.XamForms 并尝试根据 Unfocused 事件触发命令,但我不确定如何设置命令以使其正常工作。
这是我的 XAML:
<?xml version="1.0" encoding="utf-8" ?>
<rxui:ReactiveContentPage
x:Class="XamarinReactiveUISwipeView.MainPage"
x:TypeArguments="vm:MainPageViewModel"
xmlns:vm="clr-namespace:XamarinReactiveUITest.ViewModel;assembly=XamarinReactiveUITest"
xmlns:rxui="clr-namespace:ReactiveUI.XamForms;assembly=ReactiveUI.XamForms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:ios="clr- namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
xmlns="http://xamarin.com/schemas/2014/forms"
ios:Page.UseSafeArea="true">
<StackLayout>
<StackLayout Margin="10,0,0,0" Orientation="Horizontal">
<Label Text="Task ID: " />
<Entry x:Name="EntryTaskID" />
</StackLayout>
<StackLayout Margin="10,0,0,0" Orientation="Horizontal">
<Label Text="Task Name: " />
<Entry x:Name="EntryTaskName" />
</StackLayout>
</StackLayout>
</rxui:ReactiveContentPage>
这是我的代码:
public partial class MainPage : ReactiveContentPage<MainPageViewModel>
{
public MainPage()
{
InitializeComponent();
ViewModel = new MainPageViewModel();
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);
EntryTaskName.Events().Unfocused.InvokeCommand(ViewModel, vm => vm.TheCommand);
});
}
}
这是我的模型:
public class TaskItem
{
public TaskItem() { }
public string TaskID { get; set; }
public string TaskName { get; set; }
}
这是我的视图模型:
public class MainPageViewModel : ReactiveObject
{
public MainPageViewModel()
{
TheTaskItem = new TaskItem { TaskID = "1", TaskName = "TheTaskName" };
TheCommand = ReactiveCommand.Create<FocusEventArgs, Unit>(ExecuteTheCommand);
}
public ReactiveCommand<FocusEventArgs, Unit> TheCommand { get; }
private void ExecuteTheCommand(FocusEventArgs args)
{
//do something
}
private TaskItem _theTaskItem;
public TaskItem TheTaskItem
{
get => _theTaskItem;
set => this.RaiseAndSetIfChanged(ref _theTaskItem, value);
}
}
在上面的视图模型中,它不会编译,但我不知道如何设置 ExecuteTheCommand 方法。错误是:
'void MainPageViewModel.ExecuteTheCommand(FocusEventArgs)' 的返回类型错误
但在查看示例时,看起来返回 void 的方法使用 Unit 类型。
我需要在这里做什么才能正确设置命令以使其正常工作?
【问题讨论】:
-
ReactiveCommand 的格式为
ReactiveCommand.Create<TInput, TOutput>。TOutput是返回类型。鉴于您的声明,ExecuteTheCommand必须返回Unit。如果这不是您想要的,那么也许您想要...Create<TInput>在您拥有<FocusEventArgs, Unit>的两个地方,更改为<FocusEventArgs>。这个声明意味着返回类型是void。 -
好的,我首先尝试在两个地方将
更改为 ,但是当我更改 public ReactiveCommand TheCommand { get; } to public ReactiveCommand TheCommand { get; },错误转向“非泛型类型'ReactiveCommand'不能与类型参数一起使用”。但是当我将这两种类型都保留下来并且只将 Create 更改为具有 时,它起作用了。
标签: xamarin.forms command reactiveui