1

我正在尝试将自动创建的菜单项的命令绑定到由父 MenuItem 的 ViewModel 公开的 ICommand。以下是我所拥有的一个很好的代表:

自定义控件:

class MyMenuItem : MenuItem {}

视图模型:

class ParentVM
{
    public IEnumerable<ChildVM> Children { get; set; }
    public ICommand TheCommand { get; set; }
}

class ChildVM
{
    public string Name { get; set; }
}

自定义控件的全局样式:

<Style TargetType="namespace:MyMenuItem">
    <Setter Property="Header" Value="Some Text"/>
    <Setter Property="ItemsSource" Value="{Binding Children}"/>
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="MenuItem"/>
                <Setter Property="Command" Value="{Binding [parent].TheCommand}"/>
                <Setter Property="Header" Value="{Binding Name}"/>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

在上下文菜单中消费:

<ContextMenu>
    <namespace:MyMenuItem DataContext="{Binding AParentVM}"/>
</ContextMenu>

我需要知道与[父母]有什么关系。确实创建了子菜单项并且它们的名称显示正确,这告诉我我在顶层有正确的 DataContext,因为“Children”绑定正确,而我在底层拥有正确的 DataContext,因为“Name”绑定正确。我期望使用 MyMenuItem 的 AncestorType 的 RelativeSource 绑定将是需要的,但它不起作用。

4

1 回答 1

2
<Setter Property="Command" Value="{Binding DataContext.TheCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type namespace:MyMenuItem}}}"/>

或者,为子 VM 提供对父 VM 或它需要公开的命令的引用。

于 2013-06-17T06:47:56.733 回答