الامتدادات التفاعلية لـ .NET (RX): اتخاذ إجراء بمجرد اكتمال جميع الأحداث
-
28-09-2019 - |
سؤال
كدليل على المفهوم ، أريد أن أكتب "تم" في مربع نص بعد، بعدما تم فحص خانة الاختيار وتم الضغط على مفتاح في مربع نص (في أي ترتيب). أتوقع أن يتعامل هذا الرمز مع هذا ، لكنه يكتب بمجرد حدوث أي من الحدثين. شكرا لمساعدتك.
var seq = Observable.FromEvent<EventArgs>(this.checkBox, "CheckedChanged")
.Merge(Observable.FromEvent<KeyPressEventArgs>(this.textBox, "KeyPress"));
seq.Subscribe((unused) => this.resultTextBox.Text = "Done");
المحلول
يمكنك استخدام الملاحظة. عندما مثل ذلك (أضفت مربع اختيار إضافي لهذا المثال):
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);
نصائح أخرى
إذا كنت بحاجة إلى حدوث كلا الحدثين - فكر في استخدام Zip. سوف دمج الحدث إذا أي من مصادر مدمجة ترفعها.
لا تنتمي إلى StackOverflow