2013-02-10 80 views
4

我没有经验,特别是在MVVM,但试图使用ReactiveUI,我不理解我发现的示例ReactiveCommand的示例。我曾经使用过一次ICommand/DelegateCommand,但这是不同的,我没有得到它。有没有人知道ReactiveUI的ReactiveCommand的一个好例子?

我想要做的事情非常简单。点击视图中的按钮,并在视图模型中执行一个方法。我发现的所有例子都涉及IObservable <>,但我不明白,因为他们没有解释为什么总是适合我。我试图用这个作为一个学习经验,我最想做的事情就是将xaml中的按钮的Command属性绑定到一个命令(但是,它的作用,我不知道),这导致方法执行。没有集合,我只是传递一个int变量。

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

编辑 - 下面出现使用保贝茨的建议代码:

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(); 
} 
+0

这看起来是正确的 - 你能告诉我你的CodeBehind的构造函数的视图? – 2013-02-11 03:30:47

+0

后面加了代码 – 2013-02-13 03:24:05

回答

7

所以,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。这可能吗?

+0

Paul,感谢您的解释。没有使用Lambdas的经验,我尝试了添加到我编辑的问题中的代码。我在AddToDailyUsedExecuted和AddToDailyUsedAction方法中插入了断点,并且都没有达到。你能告诉我我错过了什么吗? – 2013-02-11 02:07:58

相关问题