【问题标题】:WPF Commands and ParametersWPF 命令和参数
【发布时间】:2010-09-14 04:21:18
【问题描述】:

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

我为executing commands asynchronously 组装了一个系统,但是很难使用任何需要输入数据的东西。我知道 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。这也意味着您可以随时重复使用具有不同数据源的转换器,并且不受this 类型的约束。你能解释一下为什么你觉得这是错误的吗?

标签: c# .net wpf xaml


【解决方案1】:

让我向您介绍我的开源项目 Caliburn。您可以在here 找到它。最能帮助您解决问题的功能已简要记录在 here

【讨论】:

  • 已经有一段时间了,但我认为您不介意将其扩展到仅链接的答案之外?
【解决方案2】:

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

【讨论】:

  • 起初你的建议听起来是个好主意,但后来我意识到,虽然这对于同步命令来说是一个很好的建议,但将共享(全局)对象传递给异步是一个坏主意方法,因为它可能会在执行过程中发生变化。
【解决方案3】:

尝试使用类似 MVVM 的东西:

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

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

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

有一个 ICommand 派生类可以回调您的对象,请查看此链接以了解几个实现:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 我不确定我是否会认为在我创建的每个命令命令中复制 CanExecute 和异常处理代码是一种改进。不过还是谢谢。
    猜你喜欢
    • 2012-09-11
    • 2020-11-26
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2011-03-29
    • 2016-03-25
    相关资源
    最近更新 更多