WPF:无法从ExecutedRoutedEventArgs获取原始源代码

时间:2010-04-28 04:00:29

标签: c# .net wpf

使用ExecutedRoutedEventArgs访问命令的原始来源时遇到问题。

我正在创建一个简单的分割按钮,其中一个菜单将出现在专用按钮下方,同时按下另一个按钮。当我在出现的菜单中单击一个menuitem时,会触发一个命令。此命令在splitbutton上注册。我们的想法是通过使用ExecutedRoutedEventsArgs来点击菜单项。

好的,现在问题了。如果我选择默认显示弹出菜单(IsOpen =“True”)并单击其中一个菜单项,我可以从ExecutedRoutedEventArgs获取原始资源(因此是menuitem) - 没问题。但是,如果我首先单击按钮显示菜单然后单击一个menuitem,命令的原始源将是按钮而不是MenuItem!

这是splitbutton的controltemplate:

<ControlTemplate TargetType="{x:Type usc:SplitButton}">
  <StackPanel Orientation="Horizontal">
    <Button Name="mybutton">
      <StackPanel>
        <Popup usc:SplitButton.IsPopup="True" IsOpen="True" Name="myPopup" PlacementTarget="{Binding ElementName=mybutton}" StaysOpen="False" Placement="Bottom">
        <Border BorderBrush="Beige" BorderThickness="1">
          <Menu Width="120">
            <MenuItem Header="item1" Command="usc:SplitButton.MenuItemClickCommand" />
            <MenuItem Header="item2" />
            <MenuItem Header="item3" />
           </Menu>
         </Border>
         </Popup>
         <TextBlock Text="MySplitbutton" />
        </StackPanel>
          </Button> 
      <Button Content="OK" Command="usc:SplitButton.ShowMenuCommand" />
   </StackPanel>
</ControlTemplate>

OK按钮在SplitButton上触发ShowMenuCommand,它将Popup上的IsOpen属性设置为True。

单击菜单项时,为什么OK按钮(激活菜单后)的原因是OriginalSource?

感谢。

1 个答案:

答案 0 :(得分:0)

解决方法是使用CommandParameter属性。然后,您可以将CommandParameter绑定到MenuItem本身,当执行Command时,您可以从参数中获取MenuItem

这样的事情应该有效:

<MenuItem Header="item1" 
          Command="usc:SplitButton.MenuItemClickCommand" 
          CommandParameter="{Binding RelativeSource={RelativeSource Self}}"/>