WPF命令和参数
本文关键字:参数 命令 WPF | 更新日期: 2023-09-27 17:48:52
我发现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属性绑定到数据类中的适当属性,您不需要设置命令参数,因为所有数据都已经使用正常的日常数据绑定传输到对象。
有一个ICommand派生的类可以回调到对象中,请查看以下几个实现的链接:
http://dotnet.org.za/rudi/archive/2009/03/05/the-power-of-icommand.aspx
在命令调用的方法中,打包所有需要的数据并将其发送到后台线程。
您需要一些东西来请求正确的对象。也许您只需要一个对象来存储这些参数,您的父对象可以将这些参数作为属性公开。
真正应该做的是让命令保持同步,并通过抛出一个新线程或将它们传递给命令管理器(homerolled)来异步执行它们。