有没有人知道ReactiveUI的ReactiveCommand的一个很好的例子?

Ric*_*ins 5 mvvm windows-phone reactiveui windows-phone-8

我没经验,特别是在MVVM,但尝试使用ReactiveUI,我不理解我发现的演示ReactiveCommand的示例.我曾经使用过一次ICommand/DelegateCommand,但这是不同的,我没有得到它.

我想做的事情非常简单.单击视图中的按钮,然后在视图模型中执行该方法.我发现的所有例子都涉及IObservable <>,我不明白,因为它们没有针对我的总noob的解释.

基本上,我正在尝试将其用作学习体验,而我理想的做法是将xaml中按钮的Command属性绑定到命令(但是这有效,我不知道),这会导致一个方法执行.没有集合,我只是传递一个int变量.

谢谢您的帮助.对此,我真的非常感激.

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

C#

public ReactiveCommand AddToDailyUsed { get; protected set; }

public MainPageVM()
{
    Initialize();
    AddToDailyUsed = new ReactiveCommand();
    AddToDailyUsed.Subscribe(AddToTodayUsedAction => this.AddToDailyUsedExecuted());
}

private object AddToDailyUsedExecuted()
{
    MessageBox.Show("AddToDailyUsedAction");
    return null;
}

private void AddToDailyUsedAction(object obj)
{
    MessageBox.Show("AddToDailyUsedAction");
}
Run Code Online (Sandbox Code Playgroud)

XAML

<Button Content="{Binding Strings.add, Source={StaticResource LocalStrings}}"
        Command="{Binding AddToTodayUsed}"
        Margin="-5,-10, -10,-10"
        Grid.Row="3"
        Grid.Column="2" />
Run Code Online (Sandbox Code Playgroud)

显然我错过了一些东西.我在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();
}
Run Code Online (Sandbox Code Playgroud)

Ana*_*tts 8

因此,ReactiveCommand本身就是一个IObservable<object>- 在这种情况下,您可以将IObservable概念化为一个事件 - 当调用命令时(即按下按钮时)会触发此事件.所以,在你的构造函数中,你可能会写:

MyCommand = new ReactiveCommand();
MyCommand.Subscribe(param => this.MyCommandHasExecuted());
Run Code Online (Sandbox Code Playgroud)

但是,关于IObservable的常规事件不正确的是,你可以在它们上使用LINQ:

// Now, MyCommandHasExecuted only gets run when the UserName isn't null
MyCommand.Where(param => this.UserName != null)
    .Subscribe(param => this.MyCommandHasExecuted());
Run Code Online (Sandbox Code Playgroud)

更新:您的Xaml绑定到AddToTodayUsed但您的ViewModel命令被调用AddToDailyUsed.可能是吗?