代码之家  ›  专栏  ›  技术社区  ›  Tor Haugen

wpf:输入绑定的命令参数

  •  2
  • Tor Haugen  · 技术社区  · 16 年前

    我对WPF真正喜欢的一点是,我的视图可以声明性地构建到多大程度,即使用XAML而不是代码隐藏。

    现在我真的被inputbindings难住了,因为它们的commandParameter不接受绑定。我认为我的案例是非常通用和简单的,但是我不知道如何在不使用代码的情况下做到这一点。考虑:

    <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的目的之外,它还使得在表达式混合中工作的UI设计人员没有那么强大。该死的,我的命令参数应该是一个ID,而不是一些UI元素!!

    主观性:浏览了一段时间后,我对在WPF相关问题中看到的代码数量感到震惊。我有种感觉,我们的开发人员坚持我们的旧习惯,很高兴地破解了代码隐藏文件,而不是试图利用WPF应该代表的全新的用户界面构建。你怎么认为?

    但是 最重要的是 :有人能给我看这个看似微不足道的问题的无代码解决方案吗?最好没有像这样可怕的黑客 this one .

    2 回复  |  直到 10 年前
        1
  •  3
  •   Thomas Levesque    10 年前

    我写了一篇 markup extension 允许 InputBinding Command 要进行数据绑定:

    <KeyBinding Modifiers="Control" Key="E" Command="{input:CommandBinding EditCommand}"/>
    

    您的情况略有不同,因为您希望绑定 CommandParameter ,但您可能可以修改我的代码以适合您的情况。请注意,此代码使用私有反射,它只能在完全信任的情况下工作,并且可以在WPF的较新版本(实际上是 在WPF 4.0中损坏…如果你需要的话,我可以发布一个修改过的版本)。

    另一个选项是使用可以在 MVVM toolkit :

    <Window.Resources>
        <c:CommandReference x:Key="EditCommandReference" Command="{Binding EditCommand}"/>
    </Window.Resources>
    
    ...
    
    <KeyBinding Modifiers="Control" Key="E" Command="{StaticResource EditCommandReference}"/>
    

    同样,这是为了约束 命令 属性,但可能适合绑定 命令参数

        2
  •  1
  •   Joe Stefanelli    13 年前

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