Реактивные расширения для .NET (Rx): принять меры после завершения всех событий - PullRequest
15 голосов
/ 06 октября 2010

В качестве подтверждения концепции я хочу написать «Готово» в текстовом поле после , установлен флажок и нажата кнопка в текстовом поле (в любом порядке).Я ожидал бы, что этот код справится с этим, но он пишет Done, как только произойдет любое событие.Спасибо за вашу помощь.

var seq = Observable.FromEvent<EventArgs>(this.checkBox, "CheckedChanged")
   .Merge(Observable.FromEvent<KeyPressEventArgs>(this.textBox, "KeyPress"));

seq.Subscribe((unused) => this.resultTextBox.Text = "Done");

Ответы [ 2 ]

25 голосов
/ 06 октября 2010

Вы можете использовать Observable. Когда это так (я добавил дополнительный CheckBox для этого примера):

var checkChanged  = Observable.FromEvent<EventArgs>(this.checkBox, "CheckedChanged");
var check1Changed = Observable.FromEvent<EventArgs>(this.checkBox1, "CheckedChanged");
var keyPress      = Observable.FromEvent<KeyPressEventArgs>(this.textBox, "KeyPress");

var plan1 = checkChanged
            .And(check1Changed).And(keyPress)
            .Then((cc, cc1, kp) => "Done.");

var when = Observable.When(plan1);

when.Subscribe((result) => this.resultTextBox.Text = result);

Кроме того, если вы можете объединить другие планы вместе, например, если что-то может быть "сделано ", когда срабатывает один набор событий, или также когда срабатывает другой набор событий:

var checkChanged  = Observable.FromEvent<EventArgs>(this.checkBox, "CheckedChanged");
var check1Changed = Observable.FromEvent<EventArgs>(this.checkBox1, "CheckedChanged");
var keyPress      = Observable.FromEvent<KeyPressEventArgs>(this.textBox, "KeyPress");
var keyPress1     = Observable.FromEvent<KeyPressEventArgs>(this.textBox1, "KeyPress");

var plan1 = checkChanged.And(check1Changed).And(keyPress).Then((cc, cc1, kp) => "Done.");
var plan2 = keyPress.And(keyPress1).Then((kp, kp1) => "Alternate done.");

var join = Observable.When(plan1, plan2);
1 голос
/ 06 октября 2010

если вам нужны оба события - подумайте об использовании Zip.Слияние вызовет событие, если любой объединенных источников вызовет его.

...