Этот вопрос является продолжением обсуждений в комментариях к WPF: Как правильно с точки зрения концепции MVVM вызывать новое окно командой?. Новая задача такая: нужно сделать кнопку для завершения приложения, а также реализовать возможность закрывать окно сочетанием клавиш (первая кнопка уже имеется в каждом окне - "Красный крестик", а любое приложение закрывается сочетанием Alt+F4, но это, что называется, самый простой пример для дальнейшего усложнения).
Закрытие окна сочетанием клавиш уже реализовано:
public partial class MainWindowView : Window {
public ICommand ExitCommand { get; }
public MainWindowView() {
InitializeComponent();
ExitCommand = new DelegateCommand(_ => Close());
}
XAML (Всё, что не имеет отношения, убрано):
<Window x:Class="Example.Views.MainWindowView"
xmlns:local="clr-namespace:Example">
<Window.InputBindings>
<KeyBinding Command="{Binding ExitCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
Gesture="Ctrl+E"/>
</Window.InputBindings>
Все View хранятся в папке Views, класс DelegateCommand - в корне проекта.
Первая попытка привязать событие к кнопке выглядит так:
<Window.CommandBindings>
<CommandBinding Command="local:MainWindowView.ExitCommand"/>
</Window.CommandBindings>
В этом случае IDE пишет, что имени MainWindowView в пространсве имён clr-namespace:Example нет. Так-то оно так: MainWindowView кранится в папке Views, но как приведёно ниже, работать тоже не будет:
<Window.CommandBindings>
<CommandBinding Command="local:Views.MainWindowView.ExitCommand"/>
</Window.CommandBindings>
Тогда я попробовал задать другое пространсво имён:
<Window x:Class="Example.Views.MainWindowView"
xmlns:views="clr-namespace:Example.Views"
xmlns:local="clr-namespace:Example">
<Window.CommandBindings>
<CommandBinding Command="views:MainWindowView.ExitCommand"/>
</Window.CommandBindings>
В этот раз пишет, что значение value имеет значение null.
Что следует сделать?
{Binding ExitCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}не работает что ли? – Андрей NOP Oct 10 '17 at 06:52Невозможно настроить Binding через свойство Command типа CommandBinding. Binding можно настроить только через DependencyProperty объекта DependencyObject. – Боков Глеб Oct 10 '17 at 07:01CommandBinding? У вас же собственная команда, которой вы уже присвоили методExecuteв коде,CommandBindingнужен для встроенных в WPF команд, которым нужно установить обработчик – Андрей NOP Oct 10 '17 at 07:08CommandBinding? – Андрей NOP Oct 10 '17 at 07:10New,Open,Undoи т.п., у них не определено действие, которое будет выполняться при вызове команды. CommandBinding позволяет настроить это действие. Вы используете свою реализацию команд, в конструкторе передаете метод, который будет вызван при вызове команды. CommandBinding вам не нужен. – Андрей NOP Oct 10 '17 at 07:21<Window.CommandBindings><CommandBinding Command="..."/></Window.CommandBindings>не нужен и достаточно к кнопке привязатьCommand="{Binding ExitCommand}"? – Боков Глеб Oct 10 '17 at 07:27