如何转换使用Rx Observable编写的函数.从事件处理程序的fromventpattern转换为纯.net事件处理



我有一个代码片段,有人在c#中使用Rx编写了一个使用Observable的代码。用于事件处理的fromventpattern。

下面是我使用Rx

的现有代码
private void RegisterToDigitFocusEvents(int index, TextBox digit)
{
    Observable.FromEventPattern<RoutedEventHandler, RoutedEventArgs>(
        h => digit.GotFocus += h,
        h => digit.GotFocus -= h)
        .SubscribeToElement(digit,
            _ => this.ResetDigit(digit, index),
            error => this.Log().Error("Observing digit GotFocus", error),
            () =>
            {
                /* Do nothing on complete */
            });
}

我不允许在我的项目中使用Rx。我查阅了FromEventPattern的文档,我无法清楚地理解在没有Rx的情况下编写相同代码的纯。net等效性是什么

这是我尝试的转换,你可能知道它没有像预期的那样工作

//Global index so that it can be used across functions
int index1;
private void RegisterToDigitFocusEvents(int index, TextBox digit)
{
    digit.GotFocus += digit_GotFocus;
    index1 = index;
}
void digit_GotFocus(object sender, RoutedEventArgs e)
{
    this.ResetDigit(sender as TextBox, index1);
}

正如您注意到的,我没有编写代码来取消注册事件处理程序。我不知道该把逻辑放在哪里。

我是一个初学者的Rx。澄清一下——我不想重新实现Rx为我提供的整个可观察模式,我只想编写一个与第一个代码片段等效的函数,而不使用Rx,纯。net事件。如果能在没有Rx的情况下编写本文的第一个代码片段,我将非常感激。

在我看来,这是完全等价的:

    private void RegisterToDigitFocusEvents(int index, TextBox digit)
    {
        RoutedEventHandler gotFocusHandler = (s, e) =>
        {
            try
            {
                this.ResetDigit(digit, index)
            }
            catch (Exception error)
            {
                this.Log().Error("Observing digit GotFocus", error);
            }
        };
        digit.GotFocus += gotFocusHandler;
    }

你真的应该扩展这段代码来处理窗体关闭时处理程序的分离,但以上应该是基本的要求。

如果我误解了这个问题,请告诉我。

相关内容

  • 没有找到相关文章

最新更新