CommandBinding в ContextMenu

У меня есть TreeView и я создал базовый тип TreeItem. Каждый TreeItem имеет заголовок, коллекцию TreeItem для детей и коллекцию для возможного контекстного меню. Класс TreeItem имеет следующие объекты:

public delegate void dExecute(TreeItem item);

public dExecute ExecuteTarget { get; set; }
public object Tag { get; set; }
public string Header { get; set; }
public List<TreeItem> Children { get; set; }
public List<TreeItem> ContextMenu { get; set; }

Контекстное меню снова использует HierarchicalDataTemplate для отображения объектов TreeItem (я использую класс TreeItem для элементов в виде дерева И в контекстном меню). Контекстное меню выглядит так:

<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" Visibility="{Binding ShowContextMenu}" ItemsSource="{Binding ContextMenu}">
    <ContextMenu.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Header}"  />
            <HierarchicalDataTemplate.ItemContainerStyle>
                <Style TargetType="MenuItem">
                    <Setter Property="Command" Value="{Binding Execute}"/>
                </Style>
            </HierarchicalDataTemplate.ItemContainerStyle>
        </HierarchicalDataTemplate>
    </ContextMenu.ItemTemplate>
</ContextMenu>

Контекстное меню отображается так, как я хочу. Я создал контекстное меню, которое просто прикрепляю к некоторым своим элементам в древовидном представлении. Это его содержание.

public List<TreeItem> ContextMenu
{
    get
    {
        List<TreeItem> list = new List<TreeItem>();
        TreeItem ti = new TreeItem("Some Action") { ExecuteTarget = targetMethod};
        list.Add(ti);
        ti = new TreeItem("test");
        ti.Children.Add(new TreeItem("foo") { ExecuteTarget = targetMethod});
        ti.Children.Add(new TreeItem("bar") { ExecuteTarget = targetMethod});
        ti.Children.Add(new TreeItem("foo") { ExecuteTarget = targetMethod});
        TreeItem ti2 = new TreeItem("inner"){ ExecuteTarget = targetMethod};
        ti.Children.Add(ti2);
        ti2.Children.Add(new TreeItem("foo") { ExecuteTarget = targetMethod});
        list.Add(ti);
        return list;
    }
}

Контекстное меню выглядит следующим образом.

Предоставленное контекстное меню

Это выглядит так, как должно быть. Команды работают как надо. КРОМЕ для команды на самом высоком уровне контекстного меню. Когда я нажимаю "Некоторые действия", ничего не происходит. Я предполагаю, что мне нужно что-то добавить в XAML, но я понятия не имею, где.

1 ответ

Решение
<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" Visibility="{Binding ShowContextMenu}" ItemsSource="{Binding ContextMenu}">
    <ContextMenu.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Header}"  />
            <HierarchicalDataTemplate.ItemContainerStyle>
                <Style TargetType="MenuItem">
                    <Setter Property="Command" Value="{Binding Execute}"/>
                </Style>
            </HierarchicalDataTemplate.ItemContainerStyle>
        </HierarchicalDataTemplate>
    </ContextMenu.ItemTemplate>

    <!-- this is what you're missing -->
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding Execute}"/>
        </Style>
    </ContextMenu.ItemContainerStyle>
</ContextMenu>
Другие вопросы по тегам