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

时间:2013-02-10 04:55:28

标签: mvvm windows-phone-8 windows-phone reactiveui

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

我想做的事情非常简单。单击视图中的按钮,然后在视图模型中执行该方法。我发现的所有例子都涉及IObservable<>,但我没有得到,因为他们没有解释那些适合我的总菜鸟。

基本上,我尝试将其用作学习体验,而我理想的做法是将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");
}

XAML

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

显然我错过了一些东西。我在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();
}

1 个答案:

答案 0 :(得分:8)

因此,ReactiveCommand本身就是一个IObservable<object> - 在这种情况下,您可以将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绑定到AddToTodayUsed,但您的ViewModel命令名为AddToDailyUsed。可能是吗?