我发现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 :(得分:2)
答案 1 :(得分:1)
命令用于避免UI和程序逻辑之间的紧密耦合。在这里,你试图绕过它,所以你会发现它很痛苦。您希望将UI绑定到其他对象(包含此数据),然后您的命令可以简单地调用该对象。 尝试搜索MV-V-M,或者查看PRISM示例。
答案 2 :(得分:1)
尝试使用像MVVM这样的东西:
创建一个类,存储当前“视图”中显示的所有数据(窗口,页面,对您的应用程序有意义的任何内容)。
将您的控件绑定到此类的实例。
让类暴露一些ICommand属性,将按钮的Command属性绑定到数据类中的相应属性,您不需要设置命令参数,因为所有数据都已使用普通日常数据传输到对象结合。
有一个ICommand派生类可以回调你的对象,请看几个实现的链接:
http://dotnet.org.za/rudi/archive/2009/03/05/the-power-of-icommand.aspx
在命令调用的方法中,打包所有必需的数据并将其发送到后台线程。
答案 3 :(得分:0)
您需要能够请求正确对象的内容。也许您需要一个对象来存储父对象可以作为属性公开的这些参数。
你应该做的是让命令保持同步并通过抛弃新线程或将它们传递给命令管理器(本地滚动)来异步执行它们。