В теле моем классе, у меня есть эта строка кода:Как объединить эти две команды в одну?
private ReactiveCommand<object> _displayCommand = ReactiveCommand.Create();
В конструктор класса, настроить подписку:
_displayCommand.Subscribe(_ =>
{
MessageBox.Show("Button clicked.");
});
Можно ли написать какой-то расширение метод для эффективного объединения этих двух команд в один, поэтому с помощью одного вызова функции мы можем вызвать ReactiveCommand.Create() и создать подписку с помощью Reactive Extensions (RX)?
Это объединит все логически связанные коды и сделает ViewModel намного чище.
Update
Это то, что я до сих пор (спасибо @ 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; }
}
Однако, мне нужно иногда вставить вызов .Buffer(TimeSpan.FromSeconds(1).
между displayCommand
и .Subscribe(fn)
, и эта функция недостаточно общего для этого. Мне действительно нужен способ передачи всей подписки на CreateAndSubscribe
- возможно, Func
, который принимает IObservable
?
Это означает, что я мог бы использовать что-то вроде следующего вызова функции:
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");
}));
Все эти решения устраняют IDisposable, возвращенные из подписки, поэтому API не существует в первую очередь –
@Paul Betts Во-первых, фантастическая работа над ReactiveUI, вы бог программирования среди нас простых смертных :) Если вы добавляете это как ответ, я буду отмечать его как официальный. – Contango