我真正喜欢 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 构建。你怎么看?
但最重要的是:谁能告诉我这个看似微不足道的问题的无代码解决方法?最好没有像这样的可怕黑客。