2010-02-18 62 views
9

我有一個用戶控件,增加了一個對的CommandBinding是化CommandBindings收集處理特定的命令。稍後,我在窗口中使用此控件,並希望將另一個綁定添加到該控件以添加其他行爲。這個問題雖然是我這樣做的時候,似乎當我再添給的CommandBinding控制,它會替換所有綁定的化CommandBindings收集同一命令已經作出。所以看起來像一個控件只能有一個CommandBinding控件,這是正確的嗎?我可以在同一個控件上使用同一個命令的多個CommandBindings嗎?

請參考下面它試圖設置兩個化CommandBindings爲同一保存命令的代碼示例。

<Window x:Class="MultipleCommandBindings.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Window.CommandBindings> 
    <CommandBinding Command="Save" 
        Executed="CommandBinding_Executed" /> 
    <CommandBinding Command="Save" 
        Executed="CommandBinding_Executed" /> 
</Window.CommandBindings> 
<Grid> 
    <Button Height="23" 
      HorizontalAlignment="Right" 
      Margin="0,0,25,88" 
      Name="button1" 
      VerticalAlignment="Bottom" 
      Width="75" 
      Command="Save">Button</Button> 
</Grid> 

本來我是希望無論是編譯時和運行時異常時,寫了這個代碼,但感到驚訝的是它並沒有抱怨。接下來,雖然我感到失望,因爲我的CommandBinding_Executed處理程序只被調用一次而不是我希望的兩次。

更新: 有點測試看來,我的第二個時的CommandBinding不覆蓋我的第一個,而是它出現,即使我沒有設置進行處理,以真正在我的事件處理程序的第一個命令綁定後吞噬指揮官。我在這一點上,解決我的問題是要了解爲什麼路由命令不傳播過去處理好未設置爲true,即使在第一處理非常肯定。

更新: 我發現的這恰恰印證了一些在WPF命令路由背後的奇怪行爲的信息this great little tidbit

更新: 人想過如何解決這似乎只能有每個命令一個有效的CommandBinding的事實是,它似乎是默認的CommandBinding類公開執行,CanExecute當然的事件,像所有的事件可以有多個處理程序。然後,這個想法就是用標準的CommandBindings.Add方法來爲命令添加額外的處理程序。也許這可以通過Control類的擴展方法來完成,並且可以與一個自定義的CompositeCommandBinding類結合使用,該類允許我們在一個主綁定中聚合多個綁定。

+0

我能想到的唯一的解決辦法是訂閱按鈕的Click事件,然後投View的DataContext的是它的視圖模型和使用的VAR手動執行2個命令。 – 2015-04-02 15:08:32

回答

1

我不知道你的問題的答案,但使用Reflector聽起來對我來說很合理。

我想知道你爲什麼要這樣做?也許使用Composite模式來聚合行爲更合理,而不是嘗試組合命令綁定?

+1

+1表示您應該在視圖中只有1個綁定,並讓多個行爲在堆棧中進一步調用。 – 2010-02-18 18:50:15

+0

那麼,在我的情況下,我有一個用戶控件,可以是來自內部控制傳播的幾種不同類型的命令的來源。在用戶控件中,我想知道何時發出這些命令,以便我的ViewModel可以啓動一些其他進程,其最終結果將通過我的UserControl(View)顯示。我可以綁定到我正在公開的屬性,並查看它在oder中何時更改以知道它何時可以使用,但我查看有關啓動整個流程的實際Command類型的信息。 – jpierson 2010-02-18 20:30:20

3

到目前爲止,我只能想出一個解決此問題的方法,即在邏輯樹中的兩個不同級別處理命令。在下面的示例中,我處理網格中的Save命令,然後再次在Window元素中處理。

<Window x:Class="MultipleCommandBindings.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300"> 
<Window.CommandBindings> 
    <CommandBinding Command="Save" 
        Executed="CommandBinding_Executed2"/> 
</Window.CommandBindings> 
<Grid> 
    <Grid.CommandBindings> 
     <CommandBinding Command="Save" 
         Executed="CommandBinding_Executed1" /> 
    </Grid.CommandBindings> 

    <Button Height="23" 
      HorizontalAlignment="Right" 
      Margin="0,0,25,88" 
      Name="button1" 
      VerticalAlignment="Bottom" 
      Width="75" 
      Command="Save">Button</Button> 
</Grid> 

爲了得到這個工作,我後面的代碼需要也可手動傳播命令執行到一個新的水平了。

​​

如果有人有我如何監控命令上更好的想法還是讓它自然傳播了樹我很想看到它,否則我可能只是求助於該變通方法。

相關問題