WPF:用于输入绑定的CommandParameters
我真正喜欢WPF的东西之一是我的视图可以声明性构建的程度,即。使用XAML而不是代码隐藏。WPF:用于输入绑定的CommandParameters
现在我真的被难倒化InputBindings,因为他们的CommandParameters不接受绑定。我想我的案例是非常通用和直接的,但我不明白我如何才能做到这一点,而不诉诸代码隐藏。考虑:
<ListBox Name="casingsListBox" ItemsSource="{Binding Path=Casings}" SelectedValuePath="Id">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Title}"/>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.InputBindings>
<!-- Doesn't work: -->
<MouseBinding Gesture="LeftDoubleClick"
Command="ApplicationCommands.Open"
CommandParameter="{Binding RelativeSource={RelativeSource Self} Path=SelectedValue}"/>
</ListBox.InputBindings>
</ListBox>
这不起作用,因为MouseBinding的CommandParameter的绑定表达式是非法的。
我问自己:什么是增加点击鼠标手势列表框,如果我不能得到所选择的值的点?
这可以容易地使用代码隐藏的事件处理程序,当然,或者通过具有该命令消费者提取命令源的ID解决,但也有几个原因,这是不希望的。除了大量的代码隐藏代码首先破坏了WPF的一些目的之外,这使得在Expression Blend中工作的UI设计师没有多少权力。而且,该死的,我的命令参数应该是一个id,而不是一些UI元素!
主观:有这么浏览了一会儿,我通过我的WPF相关的问题看的代码量袭击。我感觉到我们的开发人员坚持我们的旧习惯,并高兴地在代码隐藏文件中进行攻击,而不是试图利用WPF应该代表的UI构建新鲜感。你怎么看?
但最重要的:任何人都可以告诉我一个代码免费的解决方法,这个看似平凡的问题?最好没有可怕的黑客,如this one。
我写了一个markup extension,允许InputBinding
的Command
将数据绑定:因为你要绑定的CommandParameter
<KeyBinding Modifiers="Control" Key="E" Command="{input:CommandBinding EditCommand}"/>
你的情况略有不同,但你可能能适应我的代码,以适应你的情况。请注意,此代码使用私人反射,它只能以完全信任的方式工作,并且可以在更高版本的WPF中破解(实际上,它在WPF 4.0中破坏为 ...如果需要,我可以发布修改后的版本)。
另一种选择是使用可在MVVM toolkit中发现的CommandReference类:
<Window.Resources>
<c:CommandReference x:Key="EditCommandReference" Command="{Binding EditCommand}"/>
</Window.Resources>
...
<KeyBinding Modifiers="Control" Key="E" Command="{StaticResource EditCommandReference}"/>
再次,这是结合了Command
属性,但大概可以适应绑定CommandParameter
...
我只是偶然发现了这个问题,并且对我找到的解决方案还不满意。我会开始一个小赏金,看看自2009年以来是否有变化=) – Jens 2010-07-05 15:32:52