Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将这两个命令合并为一个命令?_C#_Wpf_System.reactive_Reactiveui - Fatal编程技术网

C# 如何将这两个命令合并为一个命令?

C# 如何将这两个命令合并为一个命令?,c#,wpf,system.reactive,reactiveui,C#,Wpf,System.reactive,Reactiveui,在我的类主体中,我有以下代码行: private ReactiveCommand<object> _displayCommand = ReactiveCommand.Create(); 是否可以编写某种扩展方法来有效地将这两个命令组合成一个命令,以便通过单个函数调用我们可以同时调用ReactiveCommand.Create(),并使用reactiveextensions(RX)创建订阅 这将把所有逻辑上相关的代码组合在一起,并使ViewModel更加清晰 更新 这就是我目前所拥有

在我的类主体中,我有以下代码行:

private ReactiveCommand<object> _displayCommand = ReactiveCommand.Create();
是否可以编写某种扩展方法来有效地将这两个命令组合成一个命令,以便通过单个函数调用我们可以同时调用ReactiveCommand.Create(),并使用reactiveextensions(RX)创建订阅

这将把所有逻辑上相关的代码组合在一起,并使ViewModel更加清晰

更新

这就是我目前所拥有的(感谢@jt000):

如果我想插入
.Buffer(TimeSpan.FromSeconds(1))

private ReactiveCommand\u displayCommand=
CreateAndSubscribe(o=>o.Buffer(TimeSpan.FromSeconds(1)).Subscribe(()=>
{
返回MessageBox.Show(“你好”);
}));
这样行吗

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

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

将类似的操作放入静态类中

   public static void CreateAndSubscribe(this displayCommand)
    {
        displayCommand = ReactiveCommand.Create();
        displayCommand.Subscribe(_ =>
        {
            MessageBox.Show("Button clicked.");
        });
    }
像任何其他扩展方法一样访问它:

_displayCommand.CreateAndSubscribe();

这个API实际上是故意丢失的,因为
Create
没有优雅的方法返回
ReactiveCommand
IDisposable
来自
Create
的结果。你可以用
out
参数做一些难看的事情,但最终会非常麻烦


虽然有时我肯定也会错过一个
CreateWithAction
或类似的东西,但立即
Subscribe
s有点破坏了RxUI的可组合性;此API使整合内容变得更困难,而不是更简单。

谢谢!但是,我想要一个通用的解决方案,所以我需要某种方式将订阅作为参数传递进来。谢谢。我也试过了,但还是遇到了问题。如果我想在
displayCommand
之间插入调用
.Buffer(TimeSpan.FromSeconds(1)。
,我做不到。我真正需要的是某种方式来传递整个订阅-也许是某种需要IObservable的函数?谢谢你的回答。不过,我想要一个通用的解决方案,所以我需要某种方式来传递订阅作为参数。我有大约20个这样的调用,如果只有一个基因就好了ric行可以初始化所有内容(包括设置订阅)。我认为这不会编译(ReativeCommand是一个类,不是displayCommand的成员)。这仍然不起作用…displayCommand不包含仍然不起作用的成员“ReactiveCommand”(第3行):)原因有二:1)displayCommand需要是ref或out,因为您设置了它(我认为在扩展方法中不可能这样)。2) 99%的时间Create会设置null变量,因此调用null.CreateAndSubscribe会在解析扩展方法之前导致null引用异常。我认为静态扩展方法在这里并不合适……从我的实验来看,我认为我需要的是范围。我在RX订阅中引用的属性实际上是惰性属性,因此它们是按需初始化的。实例成员(字段、属性、方法和事件)不在同一类上实例字段定义的范围内。就是这样:)所有这些解决方案都会泄漏从Subscribe返回的IDisposable,这就是为什么这个API在第一个版本中不存在的原因place@PaulBetts首先,在ReactiveUI上的出色工作,你是我们这些凡人中的编程之神:)如果你加上这个作为答案,我会将其标记为正式的。更新ReactiveCommand,以便您在其上调用IDisposable,它在其拥有的任何订阅上调用IDisposable,怎么样?这是优雅的,并导致一个返回值。我可能会看看我是否能自己写这篇文章,看看它是怎么飞的。
private ReactiveCommand<object> _displayCommand = 
    CreateAndSubscribe(o => o.Buffer(TimeSpan.FromSeconds(1)).Subscribe(() =>
                              {
                                  return MessageBox.Show("Hello");
                              }));
public static ReactiveCommand<object> CreateAndSubscribe(Func<object> fn) 
{
    var displayCommand = ReactiveCommand.Create();
    displayCommand.Subscribe(fn);
    return displayCommand;
}
CreateAndSubscribe(_ => MessageBox.Show("hi"));
   public static void CreateAndSubscribe(this displayCommand)
    {
        displayCommand = ReactiveCommand.Create();
        displayCommand.Subscribe(_ =>
        {
            MessageBox.Show("Button clicked.");
        });
    }
_displayCommand.CreateAndSubscribe();