KeyBinding 到代码后面的函数? WPF/MVVM

问题描述 投票:0回答:1

天哪KING SHT!!!!为什么我不能发表更多问题?我的问题都没有负面影响?!?!?!?这些问题太老了。这个网站说我应该改进它们是什么意思?!?!改进什么!?!?!?问题没有任何负面点并且已经解决了!?!?!?这他妈是什么问题!?!?!? FCKING R'TARD 网站!!!!!!操你!是的,我将创建另一个帐户,f'cktard!我的问题不需要改进!迟钝者

我有一个文本框,当用户按键盘上的 Enter 时,文本框中的值将被“确认”,并且字符串将被格式化为正确的小数位数。

因此,如果文本框应有 1 位小数,并且用户写入不带任何小数的“30”并按 Enter 键,则文本框将自动更新为“30.0”。

问题在于,当发生这种情况时,CaretIndex 被放置在位置 0 处。如果我在 0 之后按 Enter 键并插入插入符号,例如“30|”然后它会重置为“|30.0”而不是“30.0|”我多么想要它。

我有一个命令,当在文本框中按 Enter 键时会触发该命令。但是,该命令位于视图模型内部,我不应该触摸视图模型内的“查看事物”(插入符号)。那么我应该如何继续做呢?

我正在考虑不是绑定到视图模型中的命令,而是绑定到视图中的函数(代码隐藏),然后从该函数中我在VM中提出命令并设置插入符号,如下所示:

private void EnterPressed() { ((ParamTextNodeVM)DataContext).EnterCmd.Execute(null); ValueBox.CaretIndex = ValueBox.Text.Length; }
但是,这不起作用:

<TextBox> <TextBox.InputBindings> <KeyBinding Key="Enter" Command="{Binding EnterPressed}"/> </TextBox.InputBindings> </TextBox>
如何将“Command”绑定到隐藏代码内的“EnterPressed”?

binding command code-behind key-bindings
1个回答
1
投票
绑定到后面代码中的函数是可行的,但会违反 MVVM 模式。中继命令允许您将视图中的命令绑定到视图模型。

/// <summary> /// A basic command that runs an Action /// </summary> public class RelayCommand : ICommand { #region Private Members /// <summary> /// The action to run /// </summary> private Action mAction; #endregion #region Public Events /// <summary> /// The event thats fired when the <see cref="CanExecute(object)"/> value has changed /// </summary> public event EventHandler CanExecuteChanged = (sender, e) => { }; #endregion #region Constructor /// <summary> /// Default constructor /// </summary> public RelayCommand(Action action) { mAction = action; } #endregion #region Command Methods /// <summary> /// A relay command can always execute /// </summary> /// <param name="parameter"></param> /// <returns></returns> public bool CanExecute(object parameter) { return true; } /// <summary> /// Executes the commands Action /// </summary> /// <param name="parameter"></param> public void Execute(object parameter) { mAction(); } #endregion }
在视图模型本身中,您需要将命令声明为参数

public ICommand EnterPressedCommand { get; set; }
最后,在 ViewModel 的构造函数中,您需要将命令分配给函数

EnterPressedCommand = new RelayCommand(() => EnterPressed());
这应该允许从视图触发命令,并执行您的 EnterPressed 方法

© www.soinside.com 2019 - 2024. All rights reserved.