2012-01-26 132 views
0

我已經建立了一個UserControl,其中包含一些包含TextBlock控件的邊框。 TextBlocks的Text屬性被設置爲來自我的ViewModel對象的數據。命令和菜單

我已經添加了幾個上下文菜單中的用戶控件的資源:

<UserControl.Resources> 
    <ContextMenu x:Key="ContextMenu"> 
     <MenuItem Header="Copy Plate" Command="cs:CarSystemCommands.CopyPlateCommand" /> 
     <MenuItem Header="Search Plate" Command="cs:CarSystemCommands.SearchPlateCommand" /> 
    </ContextMenu> 
    <ContextMenu x:Key="TextBoxContextMenu"> 
     <MenuItem Header="_Copy"  Command="Copy" /> 
     <MenuItem Header="Copy Plate" Command="cs:CarSystemCommands.CopyPlateCommand" /> 
     <MenuItem Header="Search Plate" Command="cs:CarSystemCommands.SearchPlateCommand" /> 
    </ContextMenu> 
</UserControl.Resources> 

我已經添加到右鍵菜單引用我的TextBlocks。這裏有一個例子:

<Border Background="#FFFFFF78" 
     BorderBrush="Black" 
     BorderThickness="2" 
     ContextMenu="{StaticResource TextBoxContextMenu}" 
     Grid.Column="0" 
     Margin="5,10,5,5"> 
    <TextBlock FontSize="18" 
       FontWeight="Bold" 
       HorizontalAlignment="Center" 
       Margin="5" 
       x:Name="Camera" 
       VerticalAlignment="Center" /> 
</Border> 

最後,我已經添加CommbandBindings到該用戶控件:

<UserControl.CommandBindings> 
    <CommandBinding Command="Copy"         CanExecute="CopyCommand_CanExecute" Executed="CopyCommand_Executed" /> 
    <CommandBinding Command="cs:CarSystemCommands.CopyPlateCommand" CanExecute="CopyCommand_CanExecute" Executed="CopyPlateCommand_Executed" /> 
</UserControl.CommandBindings> 

我有兩個問題,而這一切對日期:

  1. 當我的權利點擊控件,我看到菜單,但選擇變灰。我在CopyCommand_CanExecute,CopyCommand_Executed和CopyPlateCommand_Executed方法的開始處放置了斷點。這些斷點僅在一次運行中被擊中。我不知道他們爲什麼在那個時候受到打擊,但不是在此之前或之後。我如何確保每次都調用CanExecute方法?

  2. 有一次斷點確實被擊中,參數的Source屬性不是我認爲是的控件,而是UserControl。我需要知道UserControl上的哪個TextBlocks引發了該事件。我怎麼做?

託尼

編輯:

的用戶控件還包含一個ComboBox控件。我發現CanExecute方法在我下拉組合框後右鍵單擊TextBlock時運行。我不必在組合框中選擇任何東西,我只需點擊它即可。

任何想法的ComboBox可能會做我的代碼不是?

另一件事是,在下拉ComboBox後,Execute事件參數的OriginalSource是ComboBox。我想在幾個TextBlocks上使用相同的Copy命令,並且我需要知道使用哪個上下文菜單,以便知道將哪個TextBlock的文本複製到剪貼板。幫幫我!

回答

0

此問題已在我的代碼中解決。事實證明,問題在於XAML處理器無法確定命令的目標是什麼。也就是說,它無法確定將命令發送到哪裏。

我能夠在我的代碼後面使用代碼修復此問題。我仍然對這個問題的XAML修復感興趣,但是我沒有時間去研究它。與此同時,我實施的解決方案正常工作。

對於那些有興趣,這裏是我寫的代碼設置命令的目標:

private void FixMenuItems(FrameworkElement element, Func<MenuItem, bool> condition) { 
    foreach (MenuItem menuItem in element.ContextMenu.Items) { 
     if (condition(menuItem)) { 
      menuItem.CommandTarget = this; 
     } 
    } 
} 

要使用該功能,你傳遞與你想的上下文菜單控件的引用修復該方法以及將作爲參數的函數返回true(如果MenuItem's CommandTarget屬性應設置爲當前對象)。

0

我發現我的問題的部分答案。我想出了一種方法,我的代碼可以確定從ContextMenu執行哪個TextBlock的Copy命令。我沒有爲需要此命令的三個TextBlocks使用通用的ContextMenu,而是爲每個TextBlock創建了一個單獨的ContextMenu。然後,我爲該TextBlock的Copy菜單項添加一個CommandParameter,並使用我想要複製的屬性的名稱。然後,在CopyCommand_Executed事件處理程序中,我檢查e.Parameter值的值並將相應控件的值複製到剪貼板。這很好。

但是,我的問題與CanExecute事件不會觸發,直到我選擇組合框中的某些東西仍然存在。我仍然需要弄清楚這一點。

編輯:

好了,一切似乎是現在的工作很好,包括CanExecute事件。我正在嘗試各種各樣的事情,一定會破壞一些東西,但現在我已經有了CommandParameter的工作,其他一切似乎都沒問題。我「要去紀念這爲答案

二編輯:。

嗯,其實,一切工作在我工作,當我張貼了這個用戶控件,但仍然存在問題

的用戶控件上述實際嵌入到另一個用戶控件的第一個用戶控件的內容包含在一個StackPanel;我設置的StackPanel作爲FocusScope這似乎是當一切都開始工作

第二控制有一個StackPanel。在根部和一些網格里面,第一個網格保持是第一個UserControl和其他一些東西。第二個Grid下面有兩個具有ContextMenus的DataGrid。它的這些ContextMenus現在不起作用。

我已將StackPanel作爲FocusScope。除非我將它製作爲FocusScope,否則第一個UserControl上的上下文菜單不起作用,因此它也是一個。最後,我製作了將兩個DataGrids保存爲FocusScope的Grid。

我認爲這個問題與FocusScopes有關,但我不知道它是如何關聯的,也沒有我嘗試過的組合。有任何想法嗎?