ReactiveCommand:在ThrownExceptions中获取命令参数

时间:2016-12-20 20:26:15

标签: c# wpf reactiveui

在我的场景中,我使用命令从DB中删除某些内容。我将ReactiveCollection绑定到WPF中的DataGrid,并使用以下代码来处理delete:

 RemoveProductCommand = ReactiveCommand.CreateFromTask<Product>(async product =>
            {
                await _licensingModel.RemoveProduct(product.Id);
            });


            RemoveProductCommand.ThrownExceptions.Subscribe(async ex =>
            {
                await ShowToUserInteraction.Handle("Could not remove product ");
            });

            Products.ItemsRemoved.Subscribe(async p =>
            {
               await RemoveProductCommand.Execute(p);
            });

我的问题是,是否有一种在ThrownExceptions中获取产品(命令参数)的内置方法?

我当然可以这样做:

 RemoveProductCommand = ReactiveCommand.CreateFromTask<Product>(async product =>
            {
                try
                {
                    await _licensingModel.RemoveProduct(product.Id);
                }
                catch (Exception e)
                {
                    throw new ProductRemoveException(product, e);
                }

            });

我的理由是我想通知用户“无法删除产品X”的信息。

编辑: 好吧,我编辑了在这里粘贴的代码,并注意到等待命令之间的区别.Execute()和Subscribing。 有可能:

  Products.ItemsRemoved.Subscribe(async p =>
            {
                try
                {
                    await RemoveProductCommand.Execute(p);
                }
                catch (Exception e)
                {

                }
            });

但是ThrownExceptions呢?

1 个答案:

答案 0 :(得分:1)

  

我的问题是,是否有一种在ThrownExceptions中获取产品(命令参数)的内置方法?

不,ThrownExceptions是一个IObservable&lt; Exception&gt;,即您订阅它以获取仅Exception的流。它不知道在发生实际异常之前传递给命令的任何命令参数。

您需要以某种方式自己存储此参数值,例如通过从Execute方法定义并抛出自定义Exception。