Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何绑定ContextMenu';单击某个函数的处理程序_C#_Wpf_Wpf Controls - Fatal编程技术网

C# 如何绑定ContextMenu';单击某个函数的处理程序

C# 如何绑定ContextMenu';单击某个函数的处理程序,c#,wpf,wpf-controls,C#,Wpf,Wpf Controls,我有一些XAML,如下所示: <UserControl x:Class="Foo"> <UserControl.Resources> <ContextMenu x:Key="ContextMenu1"> <MenuItem Header="Command 1a"/> <MenuItem Header="Command 1b"/> </ContextMenu> <Con

我有一些XAML,如下所示:

<UserControl x:Class="Foo">
  <UserControl.Resources>
    <ContextMenu x:Key="ContextMenu1">
      <MenuItem Header="Command 1a"/>
      <MenuItem Header="Command 1b"/>
    </ContextMenu>
    <ContextMenu x:Key="ContextMenu2">
      <MenuItem Header="Command 2a"/>
      <MenuItem Header="Command 2b"/>
    </ContextMenu>
  </UserControl.Resources>

  <DockPanel>
    <TreeView>
      <TreeView.Resources>
        <DataTemplate DataType="{x:Type Type1}">
          <StackPanel ContextMenu="{StaticResource ContextMenu1"}/>
        </DataTemplate>

        <DataTemplate DataType="{x:Type Type2}">
          <StackPanel ContextMenu="{StaticResource ContextMenu2"}/>
        </DataTemplate>
      </TreeView.Resources>
    </TreeView>
  </DockPanel>
</UserControl>
public class Type1 {
  public void OnCommand1a() {}
  public void OnCommand1b() {}
}

public class Type2 {
  public void OnCommand2a() {}
  public void OnCommand2b() {}
}
我需要做什么才能单击菜单上的相应项调用相应的功能

如果我加上:

Command="{Binding Path=OnCommand1a}" CommandTarget="{Binding Path=PlacementTarget}"
等等,然后在运行时,我得到关于OnCommand1a如何不是属性的错误。一些搜索表明这与常规事件有关,但我真的不明白这是怎么回事

如果我使用

Click="OnCommand1a" 
然后在UserControl上查找OnCommand1a(),而不是在绑定到DataTemplate的类型上查找


处理这个问题的标准方法是什么

首先,您需要一个扩展ICommand的类。 您可以使用以下选项:

public class DelegateCommand : ICommand
{
    private readonly Action<object> executeMethod = null;
    private readonly Func<object, bool> canExecuteMethod = null;

    public event EventHandler CanExecuteChanged
    {
        add { return; }
        remove { return; } 
    }

    public DelegateCommand(Action<object> executeMethod, Func<object, bool> canExecuteMethod)
    {
        this.executeMethod = executeMethod;
        this.canExecuteMethod = canExecuteMethod;
    }

    public bool CanExecute(object parameter)
    {
        if (canExecuteMethod == null) return true;
        return this.canExecuteMethod(parameter);
    }

    public void Execute(object parameter)
    {
        if (executeMethod == null) return;
        this.executeMethod(parameter);
    }
}
并在Type1构造函数中按以下方式设置它:

OnCommand1a = new DelegateCommand(c => Cmd1a(), null);
其中,Cmd1a是:

private void Cmd1a()
{
     //your code here
}
最后,在xaml中:

Command="{Binding Path=OnCommand1a}"    
,按照这些链接了解命令绑定并利用它。。。
Command="{Binding Path=OnCommand1a}"