【问题标题】:Control events into commands and RX控制事件到命令和 RX
【发布时间】:2010-10-02 09:12:55
【问题描述】:

我们有一些使用传统事件架构(无命令等)编写的 WPF/Silverlight 控件,并希望将其转换为兼容 MVVM 的控件。我研究了这个主题,我认为我将不得不编写命令来包装我当前在控件中拥有的事件。我现在想正确设计它,所以我也想让它成为 RX 投诉,而不仅仅是命令。

有人可以向我解释一下如何将我当前设计的事件设计成命令和 RX 事件吗?

如果我们采用类似控件的 Click 事件、为其设计命令以及 RX 兼容(可观察等)之类的东西,这将很有用,这样我就可以理解所涉及的内容。

目前它是简单的事件,使用它很容易理解:)...所以人们可以订阅它并执行自定义处理程序。 我的雇主希望我发出这些命令并对其进行 RX-ify。

我阅读了一些关于这些的文章,但发现它需要一些博士学位才​​能理解(数学对偶、主题 等):) 我无法理解它。 我正在努力将其纳入命令和 RX。请帮忙。我想好好学习这个,所以我不必再次重新设计它。

提前致谢。

【问题讨论】:

  • 我认为结合 ReactiveXaml 的 (blog.paulbetts.org/index.php/2010/06/15/…) ReactiveCommandObservable.FromEvent 可以满足您的需求,但您需要创建一些实用程序类(例如标记扩展、附加行为、附加属性)完成它。如果@Paul Betts 看到这个问题,也许他能提供一个很好的答案。

标签: wpf events mvvm system.reactive


【解决方案1】:

保罗 D, 我认为您可能只是为了技术而强迫技术。

首先您想在 WPF/SL 中使用命令模式,以便您可以编写可测试代码 (MVVM)。这与 Rx 无关。如果您的 ViewModel 构造正确,那么如果您选择在其他地方(存储库、模型、控制器等)使用 Rx,那就太好了。

WPF 使用命令而不是事件模式的原因是因为命令告诉某事发生,而事件广播某事确实发生了。当您编写一个控件时,您可以广播发生了点击,但在您的 ViewModel 中,一个命令反映了应该发生的事情。

如果我们看一个例子:

SubmitOrderCommand 可以发起调用以将模型的状态提交到存储库。这本身不需要涉及 Rx。但是,提交的进度可能会利用 Rx 来发布状态更改,例如 Submitting-->Submitted-->CreditChecked-->Accepted。

这可能会导致一些看起来像这样的合同(伪代码)

class OrderEntryViewModel
{
   public ICommand SubmitOrderCommand { get; }
}

interface IOrderRepository
{
   IObservable<OrderStatus> SubmitOrder(SubmitOrderRequest request);
}

我同意你的观点,Rx 周围有太多的学术界。我建议您查看我的博客introduction to Rx。我希望它可以帮助您更快地掌握 Rx。
更新:请查看我的书 IntroToRx.com。它取代了博客系列。

【讨论】:

    【解决方案2】:

    我不知道 ReactiveXaml 但如果你想将事件绑定到命令,我可以建议你使用 MVVM light。您可以尝试类似下面的代码,而且 MVVM 灯提供了 EventToCommand 示例:

    <Window 
       ... 
      xmlns:Interactivity="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
      xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras" 
      />
     <ComboBox ItemSource="{Binding MyCollection}">
        <Interactivity:Interaction.Triggers>
          <Interactivity:EventTrigger EventName="SelectionChanged">
             <cmd:EventToCommand Command="{Binding Path=LoadCommand}" />
          </Interactivity:EventTrigger>
        </Interactivity:Interaction.Triggers>
      </ComboBox>
    

    【讨论】:

    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多