Mvvm 有没有人知道一个关于ReactiveUI的ReactiveCommand的好例子?

Mvvm 有没有人知道一个关于ReactiveUI的ReactiveCommand的好例子?,mvvm,windows-phone-8,windows-phone,reactiveui,Mvvm,Windows Phone 8,Windows Phone,Reactiveui,我没有经验,尤其是在MVVM方面,但我尝试使用ReactiveUI,并且我不理解我发现的演示ReactiveCommand的示例。我以前曾使用过ICommand/DelegateCommand,但这是不同的,我不明白 我想做的很简单。单击视图中的一个按钮,让它在视图模型中执行一个方法。我发现的所有例子都涉及到可观察性,我不明白,因为它们没有针对我这个整体的noob的解释 基本上,我正试图将此作为一种学习体验,理想情况下,我想做的是将xaml中按钮的Command属性绑定到一个命令(但我不知道如何

我没有经验,尤其是在MVVM方面,但我尝试使用ReactiveUI,并且我不理解我发现的演示ReactiveCommand的示例。我以前曾使用过ICommand/DelegateCommand,但这是不同的,我不明白

我想做的很简单。单击视图中的一个按钮,让它在视图模型中执行一个方法。我发现的所有例子都涉及到可观察性,我不明白,因为它们没有针对我这个整体的noob的解释

基本上,我正试图将此作为一种学习体验,理想情况下,我想做的是将xaml中按钮的Command属性绑定到一个命令(但我不知道如何工作),这会导致执行一个方法。没有集合,我只传递一个int变量

谢谢你的帮助。我真的很感激

编辑-下面显示使用Paul Betts建议的代码:

C#

XAML


因此,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());