从 Xamarin Forms 中的事件执行 ReactiveUI 命令
Execute ReactiveUI Command from Event in Xamarin Forms
我在 Xamarin Forms 页面中有输入字段,我想在用户完成向其中输入文本时触发 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)' has the wrong return type
但是在查看示例时,带有 void returns 的方法似乎使用了 Unit 类型。
我需要在这里做什么才能正确设置命令以使其正常工作?
在上面的评论中,OP 说如果改变就有效:
TheCommand = ReactiveCommand.Create<FocusEventArgs, Unit>(ExecuteTheCommand);
至:
TheCommand = ReactiveCommand.Create<FocusEventArgs>(ExecuteTheCommand);
出乎意料的是,保存 Create
结果的变量类型 没有 使用相同的通用类型签名。必须是:
public ReactiveCommand<FocusEventArgs, Unit> TheCommand { get; }
根据 Rodney Littles 在评论中 link 中的文档,Unit
用于表示“void return 类型”。 (通用类型“TOutput”将为“void”;但“void”不是有效的通用类型。)
我在 Xamarin Forms 页面中有输入字段,我想在用户完成向其中输入文本时触发 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)' has the wrong return type
但是在查看示例时,带有 void returns 的方法似乎使用了 Unit 类型。
我需要在这里做什么才能正确设置命令以使其正常工作?
在上面的评论中,OP 说如果改变就有效:
TheCommand = ReactiveCommand.Create<FocusEventArgs, Unit>(ExecuteTheCommand);
至:
TheCommand = ReactiveCommand.Create<FocusEventArgs>(ExecuteTheCommand);
出乎意料的是,保存 Create
结果的变量类型 没有 使用相同的通用类型签名。必须是:
public ReactiveCommand<FocusEventArgs, Unit> TheCommand { get; }
根据 Rodney Littles 在评论中 link 中的文档,Unit
用于表示“void return 类型”。 (通用类型“TOutput”将为“void”;但“void”不是有效的通用类型。)