3

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

任何人都看到了一种明显的改进方法?

4

4 回答 4

2

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

于 2008-10-01T13:56:24.373 回答
1

尝试使用类似 MVVM 的东西:

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

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

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

有一个 ICommand 派生类回调你的对象,看看这个链接的几个实现:

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

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

于 2009-03-15T09:53:07.050 回答
1

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

于 2008-10-15T11:46:13.610 回答
0

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

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

于 2008-09-30T04:13:22.210 回答