2009-09-05 63 views
2

我真正喜欢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

+0

我只是偶然发现了这个问题,并且对我找到的解决方案还不满意。我会开始一个小赏金,看看自2009年以来是否有变化=) – Jens 2010-07-05 15:32:52

回答

3

我写了一个markup extension,允许InputBindingCommand将数据绑定:因为你要绑定的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 ...

1

解决此问题的新方法是使用Expression Triggers/Actions,它允许您在执行自定义操作(如触发命令)的任意控件上设置键盘快捷键。