命令绑定在动态MVVM上下文菜单中不起作用

时间:2011-11-18 16:17:32

标签: wpf mvvm command contextmenu

我是WPF的新手。像许多其他人一样,我正在尝试将ContextMenu绑定到ObservableCollection以创建动态上下文菜单。 除了将Command属性绑定到表示菜单项的TheCommand类的MenuItemViewModel属性外,一切都有效。该命令未被触发。我做错了什么?

要从头开始,ContextMenuImage的孩子,当鼠标悬停在Image上时会显示 <Image.ContextMenu > <ContextMenu ItemsSource="{DynamicResource ContextMenu}"

<Window.Resources>
    <local:MenuItemViewModelCollection x:Key="ContextMenu">
    </local:MenuItemViewModelCollection>

    <HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}"
                                      ItemsSource="{Binding Path=Children}">
        <HierarchicalDataTemplate.ItemContainerStyle>
            <Style TargetType="MenuItem">
                <Setter Property="Command"
                    Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}},
                                    Path=DataContext.TheCommand}"/>
              <!--  Value="{Binding Path=TheCommand}" /> I tried this too -->

            </Style>
        </HierarchicalDataTemplate.ItemContainerStyle>
    </HierarchicalDataTemplate>
</Window.Resources>

其中空的ContextMenu定义如下:

TheCommand

public class MenuItemViewModel : INotifyPropertyChanged { //... public ICommand TheCommand { //... } } 属性定义如下:

{{1}}

3 个答案:

答案 0 :(得分:4)

ContextMenus上的DataContext可能很奇怪,我打赌如果你在调试时查看Visual Studio中的输出窗口,那么将找不到TheCommand的绑定错误。请尝试以下方法:

<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.DataContext.TheCommand}"/> 

这将使用启动ContextMenu的元素的DataContext,而不是上下文菜单本身。

答案 1 :(得分:0)

你试过吗

Value="{TemplateBinding TheCommand}"

答案 2 :(得分:0)

看看我对以下问题的回答 -

Context Menu items command binding WPF using MVVM

希望它有所帮助!