繁体   English   中英

如何将这两个命令合而为一?

[英]How do I combine these two commands into one?

在我的课程正文中,我有以下代码行:

private ReactiveCommand<object> _displayCommand = ReactiveCommand.Create();

在类构造函数中,我设置了一个预订:

_displayCommand.Subscribe(_ =>
{
    MessageBox.Show("Button clicked.");
});

是否可以编写某种扩展方法来有效地将这两个命令组合为一个,因此通过一个函数调用,我们既可以调用ReactiveCommand.Create(),又可以使用响应式扩展(RX)创建预订?

这会将所有与逻辑相关的代码组合在一起,并使ViewModel更加整洁。

更新资料

这是我到目前为止(感谢@ 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; }
}

但是,我有时需要在displayCommand.Subscribe(fn)之间插入调用.Buffer(TimeSpan.FromSeconds(1). .Subscribe(fn) ,并且此函数不够通用,我真正需要的是某种方式来传递整个订阅CreateAndSubscribe也许某些需要IObservable Func

这意味着我可以使用以下函数调用:

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");
                              }));

这个API是故意丢失,因为没有为没有优雅的方式Create返回两个 ReactiveCommand IDisposable从结果Create 可以out参数的情况下做一些丑陋的事情,但最终会很麻烦。

尽管我有时肯定还会错过CreateWithAction或类似的东西,但是即时Subscribe却在击败RxUI的可组合性方面; 这个API使得将内容放在一起变得更加困难 ,而不是那么容易。

这行得通吗?

public static ReactiveCommand<object> CreateAndSubscribe(Func<object> fn) 
{
    var displayCommand = ReactiveCommand.Create();
    displayCommand.Subscribe(fn);
    return displayCommand;
}

用法:

CreateAndSubscribe(_ => MessageBox.Show("hi"));

是的,但是没有什么意义,因为在定义字段时实例成员不在范围内。 您传递给Subscribe的处理程序无法引用视图模型的任何字段或调用其任何方法。 您将无法完成示例中显示的内容,例如调用MessageBox.Show或类似的东西。

将这样的东西放在静态类中。

   public static void CreateAndSubscribe(this displayCommand)
    {
        displayCommand = ReactiveCommand.Create();
        displayCommand.Subscribe(_ =>
        {
            MessageBox.Show("Button clicked.");
        });
    }

像其他任何扩展方法一样访问它:

_displayCommand.CreateAndSubscribe();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM