Как привязать команду к MenuItem (WPF)?

Вот мой код из View.xaml.cs:

private RelayCommand _closeCommand;
public ICommand CloseCommand
{
    get
    {
        if (_closeCommand == null)
        {
            _closeCommand = new RelayCommand(param => this.OnClose());
        }
        return _closeCommand;
    }
}

public void OnClose()
{
    Close();
}

А вот код из моего View.xaml:

<Window.ContextMenu>
    <ContextMenu>
        <MenuItem Name="menuItem_Close" Header="Close" Command="{Binding CloseCommand}" />
    </ContextMenu> 
</Window.ContextMenu>

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


person Jackson Dean Goodwin    schedule 11.12.2012    source источник
comment
Вы установили DataContext?   -  person Bob.    schedule 11.12.2012
comment
Я нашел решение своей проблемы. Я использовал ViewModel, в котором было свойство, которое было другим типом ViewModel, и мне нужно было перейти к этому свойству, выполнив следующее: Command="{Binding ActiveVM.CloseCommand}"   -  person Jackson Dean Goodwin    schedule 21.12.2012
comment
Я нашел решение вашего вопроса. "укажите команду для элемента меню на табличке данных"> stackoverflow.com/questions/898852/ [1]: stackoverflow.com/questions/898852/   -  person Jacksquad    schedule 21.08.2013


Ответы (3)


ContextMenu не является частью VisualTree, поэтому DataContext не будет унаследован. Здесь ContextMenu.PlacementTarget - это своего рода реле, чтобы получить Window:

<MenuItem Name="menuItem_Close" Header="Close"
          Command="{Binding Path=PlacementTarget.DataContext.CloseCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
person LPL    schedule 11.12.2012
comment
Вы уверены, что он не получает DataContext? В моем тесте он, похоже, наследует DataContext, как и следовало ожидать ... - person McGarnagle; 11.12.2012
comment
Я пробовал ваш код для Command = ... но он не работал - как и раньше - ничего не произошло. - person Jackson Dean Goodwin; 11.12.2012
comment
@dbaseman Согласно это Popup создает собственное визуальное дерево. Это означает отсутствие наследования DataContext для ContextMenu, которое помещается во Popup. - person LPL; 12.12.2012
comment
@JacksonDeanGoodwin Есть ошибки привязки? Вы уверены, что DataContext настроен для Window? Возможно, для этого попробуйте кнопку с привязкой вашей команды в окне. - person LPL; 12.12.2012
comment
Спасибо за это. Как мне привязать static ICommand к MenuItem, не используя привязку ViewModel? В настоящее время я использую (который не работает) Command="{x:Static ...}", но, похоже, это не работает с решением, которое вы здесь предоставили. Пожалуйста помоги. - person Agent007; 09.11.2013

Старый вопрос, новый ответ. Для меня проблема заключалась в том, что GalaSoft.MvvmLight.Command.RelayCommand не поддерживал закрытие действия. RelayCommand хранит слабую ссылку на действие, поэтому закрытие освобождается почти сразу. Действие должно быть модельным методом или сохраняться каким-либо другим способом.

person SnakE    schedule 20.09.2016

для связывания перекрестного визуального дерева см.

Видимость привязки для DataGridColumn в WPF

или просто попробуйте поискать BindingProxy

person user2024396    schedule 08.04.2016