Mvvm 有没有人知道一个关于ReactiveUI的ReactiveCommand的好例子?
我没有经验,尤其是在MVVM方面,但我尝试使用ReactiveUI,并且我不理解我发现的演示ReactiveCommand的示例。我以前曾使用过ICommand/DelegateCommand,但这是不同的,我不明白 我想做的很简单。单击视图中的一个按钮,让它在视图模型中执行一个方法。我发现的所有例子都涉及到可观察性,我不明白,因为它们没有针对我这个整体的noob的解释 基本上,我正试图将此作为一种学习体验,理想情况下,我想做的是将xaml中按钮的Command属性绑定到一个命令(但我不知道如何工作),这会导致执行一个方法。没有集合,我只传递一个int变量 谢谢你的帮助。我真的很感激 编辑-下面显示使用Paul Betts建议的代码: C# XAMLMvvm 有没有人知道一个关于ReactiveUI的ReactiveCommand的好例子?,mvvm,windows-phone-8,windows-phone,reactiveui,Mvvm,Windows Phone 8,Windows Phone,Reactiveui,我没有经验,尤其是在MVVM方面,但我尝试使用ReactiveUI,并且我不理解我发现的演示ReactiveCommand的示例。我以前曾使用过ICommand/DelegateCommand,但这是不同的,我不明白 我想做的很简单。单击视图中的一个按钮,让它在视图模型中执行一个方法。我发现的所有例子都涉及到可观察性,我不明白,因为它们没有针对我这个整体的noob的解释 基本上,我正试图将此作为一种学习体验,理想情况下,我想做的是将xaml中按钮的Command属性绑定到一个命令(但我不知道如何
因此,ReactiveCommand本身就是一个
IObservable
——在这种情况下,您可以将IObservable概念化为一个事件——当调用该命令时(即按下按钮时),该事件将触发。因此,在构造函数中,您可以编写:
MyCommand = new ReactiveCommand();
MyCommand.Subscribe(param => this.MyCommandHasExecuted());
然而,IObservable的优点在于,您可以在常规事件上使用LINQ,这一点与常规事件不同:
// Now, MyCommandHasExecuted only gets run when the UserName isn't null
MyCommand.Where(param => this.UserName != null)
.Subscribe(param => this.MyCommandHasExecuted());
更新:您的Xaml绑定到
AddToDailyUsed
,但您的ViewModel命令名为AddToDailyUsed
。是吗?保罗,谢谢你的解释。由于没有使用Lambdas的经验,我尝试了添加到编辑问题中的代码。我在AddToDailyUsedExecuted和AddToDailyUsedAction方法中都插入了断点,但都没有达到。你能告诉我我遗漏了什么吗?这看起来是正确的-你能给我看一下你的视图代码的构造函数吗?
MainPageVM mainPageVM = new MainPageVM();
public MainPage()
{
InitializeComponent();
Speech.Initialize();
DataContext = mainPageVM;
ApplicationBar = new ApplicationBar();
TaskRegistration.RegisterScheduledTask();
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
//Shows the rate reminder message, according to the settings of the RateReminder.
(App.Current as App).rateReminder.Notify();
}
MyCommand = new ReactiveCommand();
MyCommand.Subscribe(param => this.MyCommandHasExecuted());
// Now, MyCommandHasExecuted only gets run when the UserName isn't null
MyCommand.Where(param => this.UserName != null)
.Subscribe(param => this.MyCommandHasExecuted());