如何从CanExecute处理程序中获取MenuItem?

时间:2016-01-16 14:54:32

标签: c# wpf menuitem canexecute

如何访问相关的getValue :: String -> String -> String getValue lang key = ( head $ filter ((== key) . head) langData) !! getLangIndex lang ?它是在动态创建的,因此我不能只使用xaml文件中的名称。

MenuItem

2 个答案:

答案 0 :(得分:1)

CanExecuteRoutedEventArgs有一个OriginalSource属性。

MSDN Doc for CanExecuteRoutedEventArgs

OriginalSender可能是TextBlock,其中"内部" MenuItem。您可能需要遍历可视树以查找parent类型的MenuItem

来自here

的示例代码
public static T GetVisualParent<T>(this DependencyObject child) where T : Visual
{
    //TODO wrap this in a loop to keep climbing the tree till the correct type is found 
    //or till we reach the end and haven't found the type
    Visual parentObject = VisualTreeHelper.GetParent(child) as Visual;
    if (parentObject == null) return null;
    return parentObject is T ? parentObject as T : GetVisualParent<T>(parentObject);
}

像这样使用

var menuItem = e.OriginalSource.GetVisualParent<MenuItem>();
if (menuItem != null)
    //Do something....

答案 1 :(得分:1)

您始终可以通过将自身绑定到CommandParameter属性来将命令UI元素传递给命令,例如

<MenuItem ... CommandParameter="{Binding RelativeSource={RelativeSource Self}}"/>

现在您可以通过CanExecuteRoutedEventArgs的Parameter属性访问MenuItem:

private void menuItem_canExecute(object sender, CanExecuteRoutedEventArgs e)
{
    var menuItem = e.Parameter as MenuItem;
    ...
}