Привязка ввода не запускает команду wpf wvvm - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть это в MainWindow.xaml

<Window.InputBindings>
        <KeyBinding Modifiers="Ctrl" Key="Delete"  Command="{Binding DelAllMessages}"/>
    </Window.InputBindings>

и в MainViewModel

public void DelAllMessages()
        {
            MessageBoxResult result = MessageBox.Show(
                "Are you sure you want to delete?",
                                          "Confirmation",
                                          MessageBoxButton.YesNo,
                                          MessageBoxImage.Question);
            if (result == MessageBoxResult.Yes)
            {
                // todo
            }
        }
}

, когда я нажимаю Ctrl + Del на клавиатуре в окне, тогда этот метод не срабатывает.отсутствует

1 Ответ

0 голосов
/ 29 ноября 2018

Вам нужно использовать команды вместо прямой привязки метода.Следует помнить, что связь между моделью представления и представлением осуществляется через свойства.

Шаг 1: -

Создайте класс обработчика команд иРеализуйте ICommand, как показано в приведенном ниже коде.

   public class CommandHandler : ICommand
{
    private Action<object> _action;
    private bool _canExeute;
    public event EventHandler CanExecuteChanged;

    private bool canExeute
    {
        set
        {
            _canExeute = value;
            CanExecuteChanged(this, new EventArgs());
        }
    }


    public CommandHandler(Action<object> action, bool canExecute)
    {
        _action = action;
        _canExeute = canExecute;
    }
    public bool CanExecute(object parameter)
    {
        return _canExeute;
    }

    public void Execute(object parameter)
    {
        _action(parameter);
    }
}

Шаг 2: - Используйте только что созданный класс Command в коде вашего окна позади.

Createсвойство ICommand и укажите свой DelAllMessages () в качестве действия для этой команды, поэтому при нажатии Clt + Del она вызывает ваш метод.

    private ICommand _KeyCommand;
    public ICommand KeyCommand
    {
        get { return _KeyCommand ?? (_KeyCommand = new CommandHandler(obj => DelAllMessages(), true)); }
    }

Шаг 3: -

Назначьте свой класс окна как DataContext для Xaml окон.

this.DataContext = this;

Проверьте весь код класса.

    public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    private ICommand _KeyCommand;
    public ICommand KeyCommand
    {
        get { return _KeyCommand ?? (_KeyCommand = new CommandHandler(obj => DelAllMessages(), true)); }
    }


    public void DelAllMessages()
    {
        MessageBoxResult result = MessageBox.Show(
            "Are you sure you want to delete?",
            "Confirmation",
            MessageBoxButton.YesNo,
            MessageBoxImage.Question);
        if (result == MessageBoxResult.Yes)
        {
            // todo
        }
    }
}

Шаг 4: -

Свяжите вновь созданное свойство Command в Xaml.

<Window.InputBindings>
    <KeyBinding Modifiers="Ctrl" Key="Delete"  Command="{Binding KeyCommand}"/>
</Window.InputBindings>

Весь код Xaml: -

<Window x:Class="WpfApp4.TriggerTest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp4"
    mc:Ignorable="d"
    Title="Window1" Height="450" Width="800">
<Window.InputBindings>
    <KeyBinding Modifiers="Ctrl" Key="Delete"  Command="{Binding KeyCommand}"/>
</Window.InputBindings>
<Grid>

</Grid>
</Window>
...