2012-01-26 91 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有关,但我不知道它是如何关联的,也没有我尝试过的组合。有任何想法吗?