gpt4 book ai didi

c# - 处理用户控件 (MVVM) 中的输入手势

转载 作者:行者123 更新时间:2023-11-30 21:15:06 27 4
gpt4 key购买 nike

使用 MVVM 模式,如何处理按键手势?

UserControl.InputBindings 将不起作用,因为它不可聚焦。

我已经定义了一个 ICommand,当键入正确的键时应该调用它,但我不知道如何将命令与 View 连接起来。

谢谢,斯特凡

最佳答案

我通过创建 DelegateCommand 类解决了这个问题。它看起来与 RelayCommand 完全相同(参见 Josh Smith),不同之处在于它允许更新回调。

public class DelegateCommand : ICommand
{
Action<object> _execute;
Predicate<object> _canExecute;

#region Constructors

public DelegateCommand()
{

}

public DelegateCommand(Action<object> execute)
: this(execute, null)
{
}

public DelegateCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");

_execute = execute;
_canExecute = canExecute;
}
#endregion // Constructors

public void Delegate(Action<object> execute)
{
_execute = execute;
}

public void Delegate(Action<object> execute, Predicate<object> canExecute)
{
_execute = execute;
_canExecute = canExecute;
}

#region ICommand Members

[DebuggerStepThrough]
public bool CanExecute(object parameter)
{
return _canExecute == null ? _execute != null : _canExecute(parameter);
}

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

public void Execute(object parameter)
{
if (CanExecute(parameter))
_execute(parameter);
}

#endregion // ICommand Members
}

然后我创建了一个类来保存静态应用程序命令。

public class CustomCommands
{
private readonly static DelegateCommand admin;

static CustomCommands()
{
admin = new DelegateCommand();
}

public static DelegateCommand AdminCommand
{
get { return admin; }
}
}

然后,我向主窗口添加了一个键绑定(bind),因为用户控件不接收按键手势。

<Window.InputBindings>
<KeyBinding Key="A" Modifiers="Control" Command="my:CustomCommands.AdminCommand"/>
</Window.InputBindings>

然后,在我的 ViewModel 中我可以像这样处理该事件:

public class OfflineViewModel : ViewModelBase
{
public OfflineViewModel()
{
CustomCommands.AdminCommand.Delegate(ShowAdmin);
}

public override void Removed()
{
base.Removed();

ReleaseAdminCommand();
}

public override void Hidden()
{
base.Hidden();

ReleaseAdminCommand();
}

void HookAdminCommand()
{
CustomCommands.AdminCommand.Delegate(ShowAdmin);
}

void ReleaseAdminCommand()
{
// Remove handling
CustomCommands.AdminCommand.Delegate(null, null);
}

void ShowAdmin(object parameter)
{
Navigation.Push(new AdminViewModel());
}
}

我可以选择在 DelegateCommand 中使用事件。

关于c# - 处理用户控件 (MVVM) 中的输入手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5900229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com