Реактивное расширение — преобразование типов Observable.FromEvent

Я пытаюсь поиграть с реактивным расширением в лаборатории, но не смог зарегистрироваться с помощью API FromEvent (я получаю исключение во время компиляции). Я хочу получать события, когда свойство textchanged вызывается в элементе управления текстовым полем, может ли кто-нибудь подсказать, что я делаю неправильно при преобразовании через API FromEvent? Я почему-то не могу ввести преобразование или преобразование из TextChangeEventArgs/EventHandler в EventHandler — пожалуйста, покажите мне, как это сделать правильно. Спасибо.

        internal delegate void TextChangedEventArgs(object sender, EventArgs e);
        var txt = new TextBox();

        var form = new Form
                      {
                          Controls = { txt }
                      };


        var subscription = Observable.FromEvent<EventHandler, TextChangedEventArgs>(
           x => (a, b) => new EventHandler(), ??????
           x => txt.TextChanged += x, 
           x => txt.TextChanged -= x
           );

       IDisposable eventSubscription = subscription.Subscribe(
           x => Console.WriteLine("Subscriber Got " + x),
           x => Console.WriteLine("An exception has occured" + x),
           () => Console.WriteLine("Action completed"));

        Console.WriteLine("in here");
       using (new CompositeDisposable(eventSubscription)) { Application.Run(form); }

        Console.ReadKey();

person Rohit Sharma    schedule 10.05.2011    source источник


Ответы (3)


Попробуй это:

var subscription = Observable.FromEventPattern<TextChangedEventArgs>(txt, "TextChanged"); 
person Mark Good    schedule 10.05.2011
comment
Я нашел свое решение в пространстве имен Microsoft.Phone.Reactive, документированном MSDN. RX-Team, кажется, часто меняет такие вещи в своих API. Спасибо за подсказку. - person Nappy; 13.05.2011

Пытаться:

var subscription = Observable.FromEvent(h => txt.TextChanged += h,
                                        h => txt.TextChanged -= h);
person James Hay    schedule 10.05.2011
comment
Я использую консольное приложение и использую dll/пространство имен Windows.Form, TextChangedEventHandler является делегатом презентации WPF, есть ли способ сделать это с помощью winform? - person Rohit Sharma; 10.05.2011
comment
@Rohit Sharma - см. мой исправленный пример для текстового поля winforms - person James Hay; 10.05.2011
comment
Спасибо, Джеймс. Я пробовал это раньше, но получаю ошибку времени компиляции, не могу неявно преобразовать тип System.Action в System.EventHandler. - person Rohit Sharma; 10.05.2011
comment
Я только что попробовал это в приложении Win Forms, и оно отлично компилируется! - person James Hay; 10.05.2011
comment
Спасибо за подтверждение, но не могли бы вы поделиться номером версии RX core dll, пожалуйста? - person Rohit Sharma; 10.05.2011
comment
Конечно... Я использую 1.0.2856.0. - person James Hay; 10.05.2011
comment
@Rohit Sharma - я считаю, что некоторые перегрузки FromEvent были переименованы в FromEventPattern в последнем выпуске, поэтому я бы рекомендовал попробовать это. - person Richard Szalay; 11.05.2011
comment
Привет, Ричард/Джеймс! Большое спасибо, FromEventPattern — это то, что я на самом деле намеревался использовать (кажется, лаборатория/документация не обновлена). Ваше здоровье. - person Rohit Sharma; 11.05.2011

Попробуйте это (изменить: если вы ориентируетесь на Реактивный API для Windows Phone):

var subscription = Observable.FromEvent<TextChangedEventArgs>(txt, "TextChanged");
person Nappy    schedule 10.05.2011
comment
я не вижу этой перегрузки в последней библиотеке RX, которую я скачал в прошлую пятницу - person Rohit Sharma; 10.05.2011
comment
Он переименован в FromEventPattern. - person Jack Ukleja; 27.07.2011