Привязка команд не работает в динамическом контекстном меню MVVM - PullRequest
2 голосов
/ 18 ноября 2011

Я новичок в WPF. Как и многие другие, я пытаюсь связать ContextMenu с ObservableCollection, чтобы создать динамическое контекстное меню. Все работает, кроме привязки свойства Command к свойству TheCommand класса MenuItemViewModel, представляющего пункт меню. Команда не запущена. Что я делаю не так?

Для начала, ContextMenu является дочерним по отношению к Image и отображается, когда мышь находится над Image.

 <Image.ContextMenu >
        <ContextMenu ItemsSource="{DynamicResource ContextMenu}"

где пустое 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>

Свойство TheCommand определено ниже:

public class MenuItemViewModel : INotifyPropertyChanged
{
       //...
       public ICommand TheCommand
       {
             //...
       }
}

Ответы [ 3 ]

4 голосов
/ 18 ноября 2011

DataContext в ContextMenus может быть странным, держу пари, если вы посмотрите в окне вывода в Visual Studio при отладке, что будет ошибка привязки для не найденной TheCommand. Попробуйте следующее:

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

При этом будет использоваться DataContext элемента, из которого запускается ContextMenu, а не само контекстное меню.

0 голосов
/ 29 июля 2015

Посмотрите на мой ответ на следующий вопрос -

Привязка команды контекстного меню к команде WPF с использованием MVVM

Надеюсь, это поможет!

0 голосов
/ 18 ноября 2011

Вы пробовали

Value="{TemplateBinding TheCommand}"?

...