Привязка команды элемента подменю в контекстном меню

У меня есть TreeView с иерархическим шаблоном данных (2 уровня). У меня есть контекстное меню, созданное на первом уровне дерева с 3 уровнями. Я хочу привязать команду моей модели представления ко второму уровню контекстного меню. К сожалению, я могу заставить ее работать только при использовании команды в моей модели, а это не то, что я хочу делать... Если возможно, я бы хотел сделать все это в XAML.

Я проверил чистые решения xaml, приведенные здесь и здесь. В конструкторе "Tag" подчеркнута синяя поговорка

 "Не удалось разрешить тег свойства в контексте данных типа System.Windows.UIElement" 
или, если я использую "Parent.PlacementTarget....", дизайнер говорит мне, что
 PlacementTarget не может быть разрешен в контексте данных типа System.Windows.DependencyObject. 
Код компилируется, но моя команда никогда не достигается.

Вот что у меня есть:

В ResourceDictionary:

<DataTemplate DataType="{x:Type viewModel:UpdateToolViewModel}">
    <view:UpdateToolView/>
</DataTemplate>

<DataTemplate x:Key="ToolNameDataTemplate" DataType="{x:Type src:Element}">
    <Grid>
        <TextBlock Text="{Binding Path=NameProperty.Value}" FontSize="12" />
    </Grid>
</DataTemplate>
<HierarchicalDataTemplate x:Key="ToolGroupsDataTemplate" ItemsSource="{Binding Elements}" DataType="{x:Type src:ElementGroup}" ItemTemplate="{StaticResource ToolNameDataTemplate}">
    <TextBlock Text="{Binding Path=TextProperty.Value}" FontSize="14" FontWeight="Bold" Tag="{Binding ElementName=UpdateToolControl}">
        <TextBlock.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Add Tool" ItemContainerStyle="{StaticResource ToolGroupContextMenuToolsItemStyle}" >
                    <MenuItem.ItemsSource>
                        <CompositeCollection>
                            <MenuItem Header="Add New ..." Command="{Binding PlacementTarget.Tag.DataContext.AddToolCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=ContextMenu}}" />
                            <CollectionContainer Collection="{Binding Source={StaticResource AddToolContextMenuSource}}"/>
                        </CompositeCollection>
                    </MenuItem.ItemsSource>
                </MenuItem>
            </ContextMenu>
        </TextBlock.ContextMenu>            
    </TextBlock>
</HierarchicalDataTemplate>

В пользовательском контроле:

<UserControl x:Class="...UpdateToolView" ... Name="UpdateToolControl">
    <TreeView Name="ToolTreeView" ItemsSource="{Binding AllElementsInGroups}"
              ItemTemplate="{StaticResource ToolGroupsDataTemplate}"
              ItemContainerStyle="{StaticResource ToolTreeViewItemStyle}"/>
</UserControl>

Я уже нахожусь на грани использования команды в моей модели, вызова метода в моей модели представления. Не хорошо, но я просто не понимаю, как это работает по-другому.

1 ответ

Решение

Я просто продолжал пытаться выяснить, как добавить команду к элементам CollectionContainer, когда обнаружил следующее: привязка CollectionContainer (извините, это немецкий, но здесь уместен код xaml)

Теперь я добавил команду в ItemContainerStyle из MenuItem и вдруг все работает (хотя в конструкторе "Tag" по-прежнему подчеркивается синим цветом):

<converter:ElementToToolTipConverter x:Key="ElementToToolTipConverter"/>
<Style x:Key="ToolGroupContextMenuToolsItemStyle" TargetType="{x:Type MenuItem}">
    <Setter Property="Header" Value="{Binding Name}"/>
    <Setter Property="ItemsSource" Value="{Binding Children}"/>
    <Setter Property="ToolTip" Value="{Binding Element, Converter={StaticResource ElementToToolTipConverter}}"/>
    <Setter Property="Command" Value="{Binding PlacementTarget.Tag.DataContext.AddToolCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"/>
    <Setter Property="CommandParameter" Value="{Binding}"/>
</Style>

Иногда это уже помогает думать о чем-то другом...:)

Другие вопросы по тегам