Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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# 将项目绑定到菜单项->;使用命令_C#_Wpf_Binding_Menu_Menuitem - Fatal编程技术网

C# 将项目绑定到菜单项->;使用命令

C# 将项目绑定到菜单项->;使用命令,c#,wpf,binding,menu,menuitem,C#,Wpf,Binding,Menu,Menuitem,我有一个菜单项,其中包含一组项目。它看起来像文件->打开菜单项 因此: 文件 打开 从数据库打开 文件1 文件2 文件3 XAML代码: <Menu> <MenuItem Header="File"> <MenuItem Header="Open"> <MenuItem Header="From Database" ItemsSource="{Binding OCFragebogen}"/> <

我有一个菜单项,其中包含一组项目。它看起来像文件->打开菜单项

因此:

  • 文件
    • 打开
      • 从数据库打开
        • 文件1
        • 文件2
        • 文件3
XAML代码:

<Menu>
<MenuItem Header="File">
    <MenuItem Header="Open">
        <MenuItem Header="From Database" ItemsSource="{Binding OCFragebogen}"/>
    </MenuItem>
</MenuItem>
</Menu>

我想在单击特定项时调用命令。示例:用户单击文件1时,应调用命令,其中“文件1”是命令参数

ViewModel包含我希望在菜单项“集合”中显示的项

private observeCollection\u OCFragebogen;
公共可观测收集OCFragebogen
{
得到
{
如果(_OCFragebogen==null)
_OCFragebogen=新的ObservableCollection();
返回_OCFragebogen;
}
设置
{
_OCFragebogen=值;
RaisePropertyChanged(()=>OCFragebogen);
}
}
要明确一点:当用户单击菜单项中的某个项目(来自ItemsSource)时,应该调用一个命令,以便对单击的项目执行操作


编辑:我必须在哪里使用命令来调用ViewModel中的方法(RelayCommand)?我希望在单击ItemsSource中的某个项时使用它+我希望将单击的项传递给该方法。

尝试更改其ItemContainerStyle,然后从ItemsSource Item绑定命令

<MenuItem Header="From Database" ItemsSource="{Binding OCFragebogen}"
<MenuItem.ItemContainerStyle>
  <Style TargetType="MenuItem">
    <Setter Property="Command" Value="{Binding YourCommand}" />
  </Style>
</MenuItem.ItemContainerStyle>
</MenuItem>

这应该适合您

<MenuItem Header="From Database" 
          ItemsSource="{Binding YourItemSource}">
    <MenuItem.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem}, Path=DataContext.YourCommandName}"></Setter>
            <Setter Property="CommandParameter" Value="{Binding}"></Setter>
         </Style>
     </MenuItem.ItemContainerStyle>
</MenuItem>


您的问题是?我不知道我必须在哪里使用该命令,以及如何使用
CommandParameter
将单击的项目传递给该命令。我目前正在使用菜单项中标题为“From Database”的
命令,但它不会调用该命令,因为我从ItemsSource中单击了该项。这是我正在寻找的,但它不起作用。命令没有被调用+我仍然需要将单击的项传递给我调用的命令。啊,现在我了解了一些。我以为你有所有菜单项的ItemsSource,每个菜单项都有自己的命令。但事实并非如此,menuitem是一个集合,但每个集合都有相同的操作,但参数不同。你能澄清一下吗?完全正确。菜单项包含一个ItemsSource。每个项目都应该调用相同的命令,但使用不同的参数(参数应该是项目本身),因此我可以处理单击的项目。看起来有点像这样,我们可以尝试将命令绑定到相对源。假设您要绑定到的命令与您的ItemsSource处于同一级别,即OCFragebogen将其命名为YourCommand,因此感谢您的帮助,但Nitesh的速度更快。不管怎样,我投票支持你的答案,因为我只能允许1个答案是正确的。
                <MenuItem Header="From Database" ItemsSource="{Binding OCFragebogen}">
                    <MenuItem.ItemContainerStyle>
                        <Style TargetType="MenuItem">
                            <Setter Property="Command" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MenuItem}}, Path=DataContext.YourCommand }" />
                            <Setter Property="CommandParameter" Value="{Binding RelativeSource={RelativeSource Self},  Path=Header}"/>
                        </Style>
                    </MenuItem.ItemContainerStyle>
                </MenuItem>
<MenuItem Header="From Database" 
          ItemsSource="{Binding YourItemSource}">
    <MenuItem.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem}, Path=DataContext.YourCommandName}"></Setter>
            <Setter Property="CommandParameter" Value="{Binding}"></Setter>
         </Style>
     </MenuItem.ItemContainerStyle>
</MenuItem>