2

我真正喜欢 WPF 的一件事是我的视图可以在多大程度上以声明方式构建,即。使用 XAML 而不是代码隐藏。

现在我真的被 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 构建。你怎么看?

最重要的是:谁能告诉我这个看似微不足道的问题的无代码解决方法?最好没有像这样的可怕黑客。

4

2 回答 2

3

我写了一个标记扩展,允许InputBinding'sCommand被数据绑定:

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

您的情况略有不同,因为您想绑定CommandParameter,但您可以调整我的代码以适合您的情况。请注意,此代码使用私有反射,它只能在完全信任的情况下工作,并且可以在 WPF 的更高版本中被破坏(实际上它在 WPF 4.0 中破坏......如果您需要,我可以发布修改版本)。

另一种选择是使用可以在MVVM 工具包中找到的 CommandReference 类:

<Window.Resources>
    <c:CommandReference x:Key="EditCommandReference" Command="{Binding EditCommand}"/>
</Window.Resources>

...

<KeyBinding Modifiers="Control" Key="E" Command="{StaticResource EditCommandReference}"/>

同样,这是用于绑定Command属性,但可能适用于绑定CommandParameter...

于 2009-09-07T19:04:45.640 回答
1

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

于 2009-09-06T20:23:26.380 回答