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();