簡體   English   中英

如何將這兩個命令合而為一?

[英]How do I combine these two commands into one?

在我的課程正文中,我有以下代碼行:

private ReactiveCommand<object> _displayCommand = ReactiveCommand.Create();

在類構造函數中,我設置了一個預訂:

_displayCommand.Subscribe(_ =>
{
    MessageBox.Show("Button clicked.");
});

是否可以編寫某種擴展方法來有效地將這兩個命令組合為一個,因此通過一個函數調用,我們既可以調用ReactiveCommand.Create(),又可以使用響應式擴展(RX)創建預訂?

這會將所有與邏輯相關的代碼組合在一起,並使ViewModel更加整潔。

更新資料

這是我到目前為止(感謝@ jt000)的內容:

public static ReactiveCommand<object> CreateAndSubscribe(Func<object> fn)
{
    var displayCommand = ReactiveCommand.Create();
    displayCommand.Subscribe<object>(_ => fn.Invoke());
    return displayCommand;
}

private ReactiveCommand<object> _displayCommand = CreateAndSubscribe(() =>
{
    return MessageBox.Show("Hello");
});

public ReactiveCommand<object> DisplayCommand
{
    get { return _displayCommand; }
    protected set { _displayCommand = value; }
}

但是,我有時需要在displayCommand.Subscribe(fn)之間插入調用.Buffer(TimeSpan.FromSeconds(1). .Subscribe(fn) ,並且此函數不夠通用,我真正需要的是某種方式來傳遞整個訂閱CreateAndSubscribe也許某些需要IObservable Func

這意味着我可以使用以下函數調用:

private ReactiveCommand<object> _displayCommand = 
    CreateAndSubscribe(o => o.Subscribe(() =>
                              {
                                  return MessageBox.Show("Hello");
                              }));

並且如果我想插入.Buffer(TimeSpan.FromSeconds(1))

private ReactiveCommand<object> _displayCommand = 
    CreateAndSubscribe(o => o.Buffer(TimeSpan.FromSeconds(1)).Subscribe(() =>
                              {
                                  return MessageBox.Show("Hello");
                              }));

這個API是故意丟失,因為沒有為沒有優雅的方式Create返回兩個 ReactiveCommand IDisposable從結果Create 可以out參數的情況下做一些丑陋的事情,但最終會很麻煩。

盡管我有時肯定還會錯過CreateWithAction或類似的東西,但是即時Subscribe卻在擊敗RxUI的可組合性方面; 這個API使得將內容放在一起變得更加困難 ,而不是那么容易。

這行得通嗎?

public static ReactiveCommand<object> CreateAndSubscribe(Func<object> fn) 
{
    var displayCommand = ReactiveCommand.Create();
    displayCommand.Subscribe(fn);
    return displayCommand;
}

用法:

CreateAndSubscribe(_ => MessageBox.Show("hi"));

是的,但是沒有什么意義,因為在定義字段時實例成員不在范圍內。 您傳遞給Subscribe的處理程序無法引用視圖模型的任何字段或調用其任何方法。 您將無法完成示例中顯示的內容,例如調用MessageBox.Show或類似的東西。

將這樣的東西放在靜態類中。

   public static void CreateAndSubscribe(this displayCommand)
    {
        displayCommand = ReactiveCommand.Create();
        displayCommand.Subscribe(_ =>
        {
            MessageBox.Show("Button clicked.");
        });
    }

像其他任何擴展方法一樣訪問它:

_displayCommand.CreateAndSubscribe();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM