2013-02-10 105 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

相關問題