2009-09-05 69 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,它允許您在執行自定義操作(如觸發命令)的任意控件上設置鍵盤快捷鍵。