2008-09-30 63 views
4

我发现WPF命令参数是一个限制。也许这是一个迹象,表明我将它们用于错误的目的,但在我放弃并采取不同的方式之前,我仍然试着尝试。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)。

任何人都看到一个明显的方法来改善这一点?

+0

我不明白为什么这是一个问题。因为我记得使用它,所以我使用了WPF。 这也意味着您可以随时重新使用具有不同数据源的转换器,并且不受“this”类型限制。 你能澄清你为什么觉得这是错的? – 2008-10-15 08:19:54

回答

0

你需要的东西,可以让你请求适当的对象。也许你需要一个对象来存储父对象可以作为属性公开的这些参数。

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

+0

我不确定我会认为这是一个改进,必须在我创建的每个命令命令中复制CanExecute和异常处理代码。 虽然谢谢。 – nedruod 2008-09-30 05:49:50

2

让我来指点一下我的开源项目Caliburn。你可以在here找到它。最能帮助您解决问题的功能简要记录here

+0

这已经有一段时间了,但我不认为你会介意将这个扩展到仅限于链接的答案之外吗? – 2015-03-18 01:10:51

1

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

+0

起初你的建议听起来像是一个非常好的主意,但后来我意识到,虽然这对于同步命令是一个非常好的建议,但将共享(全局)对象传递给异步方法是一个坏主意,因为它可能会改变mid-执行。 – nedruod 2008-10-23 06:04:49

1

尝试使用类似MVVM:

创建存储在当前的“视图”(窗口,网页,无论是有道理的,你的应用程序)中显示的所有数据的类。

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

让类暴露一些ICommand属性,将按钮的Command属性绑定到数据类中相应的属性,不需要设置命令参数,因为所有数据都已使用正常情况转移到对象数据绑定。

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

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

内部由命令调用的方法,包所需的所有数据,并把它送上后台线程。