【问题标题】:Using ReactiveUI InvokeCommand Extension with Changing Targets使用带有更改目标的 ReactiveUI InvokeCommand 扩展
【发布时间】:2014-10-28 22:46:21
【问题描述】:

虽然以下代码有效,但我不确定这是最佳做法。我想知道我是否过度考虑了这种情况。

情况:下面的代码在我的主 ViewModel 构造函数中。 ViewModel 有一个属性MessageHandler,它上面有一个ReactiveCommand 属性,称为ReceiveMessage。 ViewModel 有另一个属性ScannerViewModel,上面有一个RawMessage 属性。我想使用 ReactiveUI .InvokeCommand() 扩展方法将RawMessage 传递到ReceiveMessage。我想要这个,因为它可以方便地为我检查.CanExecute。即使MessageHandler(甚至可能是ReceiveMessage)和ScannerViewModel 可能会发生变化,这种情况也应该发生。

 this.WhenAnyValue(t => t.MessageHandler.ReceiveMessage)
     .Select(cmd => 
             this.WhenAnyValue(t => t.ScannerViewModel.RawMessage)
                 .InvokeCommand(cmd))
     .Scan(Disposable.Empty,
             (acc, n) =>
                        {
                            acc.Dispose();
                            return n;
                        })
     .Subscribe();

所以上面的方法似乎有效。我不太确定我是否需要在进行过程中处理以前的InvokeCommand 一次性用品,所以.Scan 部分可能不需要,或者可以做得更好。

我尝试了InvokeCommand 扩展的重载,它允许您分配一个目标,但它似乎是静态的,或者我无法弄清楚将Observable 作为目标的语法:

 this.WhenAnyValue(t => t.ScannerViewModel.RawMessage)
     .InvokeCommand(MessageHandler, m => m.ReceiveMessage);

这将跟随 RawMessage 的父项更改,但如果 MessageHandler 更改则中断。这不会编译:

 this.WhenAnyValue(t => t.ScannerViewModel.RawMessage)
     .InvokeCommand(this.WhenAnyValue(t => t.MessageHandler), m => m.ReceiveMessage);

我不反对保留我所拥有的,除非有人发现它存在缺陷。我正在寻找一些可能不那么冗长且更容易理解的东西。

【问题讨论】:

    标签: c# reactiveui


    【解决方案1】:

    不要问我为什么不这样做:

     this.WhenAnyValue(t => t.ScannerViewModel.RawMessage)
         .InvokeCommand(this, t => t.MessageHandler.ReceiveMessage);
    

    我把它倒过来看了。我认为这将实现我想要的。

    我一次又一次地发现这个框架已经找到了我发现的问题的解决方案——这只是我自己摸索的问题。

    【讨论】:

    • 别担心,这发生在我们最好的人身上:) 现在是 2021 年,我是 Reactive UI 的新手,感谢您分享您的解决方案。令人惊叹的图书馆涵盖了所有内容!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多