7

私は特に 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();
}
4

1 に答える 1

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ます。それはそれでしょうか?

于 2013-02-10T23:04:20.283 に答える