WPF命令和参数

时间:2020-03-06 14:54:22  来源:igfitidea点击:

我发现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)。

任何人都可以看到一种明显的方法来改善这一点吗?

解决方案

我们需要一些可以允许我们请求适当对象的东西。也许我们需要一个仅用于存储父对象可以作为属性公开的参数的对象。

实际上,我们应该做的是使命令保持同步,并通过抛出新线程或者将其传递给命令管理器(本地滚动)来异步执行它们。

让我指出开源项目Caliburn。我们可以在这里找到它。此处简要介绍了最有助于解决问题的功能

命令是为了避免UI与程序逻辑之间的紧密耦合。在这里,我们正在尝试解决这个问题,因此我们会感到痛苦。我们希望将UI绑定到其他对象(包含此数据),然后命令可以简单地对该对象进行调用。
尝试搜索MV-V-M,或者查看PRISM示例。

尝试使用类似MVVM的方法:

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

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

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

有一个ICommand派生类,该类会回调对象,请查看此链接以获取几种实现:

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

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