[英]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.