WPF命令和参数

本文关键字:参数 命令 WPF | 更新日期: 2023-09-27 17:48:52

我发现WPF命令参数是一个限制。也许这是我把它们用于错误目的的迹象,但在我放弃并采取不同策略之前,我仍在尝试。

我构建了一个异步执行命令的系统,但很难使用任何需要数据输入的东西。我知道WPF命令的一个常见模式是传入this。但是this对于异步命令根本不起作用,因为所有依赖属性都是不可访问的。

我最终得到了这样的代码:

<Button Command="{Binding ElementName=servicePage, Path=InstallServiceCommand}">
  <Button.CommandParameter>
     <MultiBinding Converter="{StaticResource InstallServiceParameterConverter}">
        <MultiBinding.Bindings>
           <Binding ElementName="servicePage" Path="IsInstalled"/>
           <Binding ElementName="localURI" Path="Text"/>
           <Binding ElementName="meshURI" Path="Text"/>
           <Binding ElementName="registerWithMesh" Path="IsChecked"/>
         </MultiBinding.Bindings>
      </MultiBinding>
  </Button.CommandParameter>
</Button>

并且还需要InstallServiceParametersConverter类(加上InstallServiceParameters)。

有人看到明显的改进方法了吗?

WPF命令和参数

让我向您介绍我的开源项目Caliburn。你可以在这里找到它。最有助于解决问题的功能在这里简要介绍

命令用于避免UI和程序逻辑之间的紧密耦合。在这里,你试图避开它,所以你会发现它很痛苦。您希望将UI绑定到其他对象(包含此数据),然后您的命令可以简单地调用该对象。尝试搜索MV-V-M,或者查看PRISM示例。

尝试使用类似MVVM:的东西

创建一个类,存储当前"视图"(窗口、页面,任何对应用程序有意义的内容)中显示的所有数据。

将控件绑定到此类的实例。

让类公开一些ICommand属性,将按钮的Command属性绑定到数据类中的适当属性,您不需要设置命令参数,因为所有数据都已经使用正常的日常数据绑定传输到对象。

有一个ICommand派生的类可以回调到对象中,请查看以下几个实现的链接:

http://dotnet.org.za/rudi/archive/2009/03/05/the-power-of-icommand.aspx

在命令调用的方法中,打包所有需要的数据并将其发送到后台线程。

您需要一些东西来请求正确的对象。也许您只需要一个对象来存储这些参数,您的父对象可以将这些参数作为属性公开。

真正应该做的是让命令保持同步,并通过抛出一个新线程或将它们传递给命令管理器(homerolled)来异步执行它们。