输入绑定不触发命令 wpf mvvm
input binding is not firing command wpf wvvm
我在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
}
}
}
当我在 window 中按键盘上的 ctrl+del 时,此方法不会 hit.what 丢失了吗?
您需要使用命令而不是直接绑定方法。要记住的一个想法是为了在 View 模型和 View 之间通过属性进行通信。
第一步:-
创建命令处理程序 class 并实现 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 步:-
在您的 Window 代码后面使用新创建的 class 命令。
创建 ICommand
的 属性 并提供您的 DelAllMessages() 作为对该命令的操作,因此当 Clt + Del
按下时,它会调用您的方法。
private ICommand _KeyCommand;
public ICommand KeyCommand
{
get { return _KeyCommand ?? (_KeyCommand = new CommandHandler(obj => DelAllMessages(), true)); }
}
第 3 步:-
将您的 window class 作为 DataContext
分配给 windows' Xaml.
this.DataContext = this;
检查整个 class 代码。
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
}
}
}
第四步:-
在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>
我在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
}
}
}
当我在 window 中按键盘上的 ctrl+del 时,此方法不会 hit.what 丢失了吗?
您需要使用命令而不是直接绑定方法。要记住的一个想法是为了在 View 模型和 View 之间通过属性进行通信。
第一步:-
创建命令处理程序 class 并实现 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 步:- 在您的 Window 代码后面使用新创建的 class 命令。
创建 ICommand
的 属性 并提供您的 DelAllMessages() 作为对该命令的操作,因此当 Clt + Del
按下时,它会调用您的方法。
private ICommand _KeyCommand;
public ICommand KeyCommand
{
get { return _KeyCommand ?? (_KeyCommand = new CommandHandler(obj => DelAllMessages(), true)); }
}
第 3 步:-
将您的 window class 作为 DataContext
分配给 windows' Xaml.
this.DataContext = this;
检查整个 class 代码。
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
}
}
}
第四步:-
在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>