簡體   English   中英

在后面的代碼中鍵綁定到 function? WPF/MVVM

[英]KeyBinding to a function in code behind? WPF/MVVM

我有一個文本框,當用戶在鍵盤上按 Enter 鍵時,文本框中的值得到“確認”,並且字符串被格式化為正確的小數位數。

因此,如果文本框應該有 1 位小數,並且用戶輸入“30”而沒有任何小數並按 Enter,那么文本框會自動更新為“30.0”。

問題是發生這種情況時 CaretIndex 位於位置 0。 如果我在 0 之后使用插入符號按 Enter,例如“30 |” 然后它被重置為“|30.0”而不是“30.0|” 我想要它。

我有一個在文本框中按下回車鍵時觸發的命令。 但是,該命令位於 View Model 內,我不應該在 View Model 內觸摸 View things(插入符號)。 那么我應該怎么做呢?

我正在考慮而不是綁定到視圖 model 中的命令,而是綁定到視圖中的 function(代碼后面)並從該 function 中引發命令,例如:

    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”?

在后面的代碼中綁定到 function 會起作用,但會違反 MVVM 模式。 中繼命令允許您將視圖中的命令綁定到視圖 model。

 /// <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
}

在視圖 model 本身中,您需要將命令聲明為參數

public ICommand EnterPressedCommand { get; set; }

最后,在 ViewModel 的構造函數中,您需要將命令分配給 function

EnterPressedCommand = new RelayCommand(() => EnterPressed());

這應該允許從視圖觸發命令,並執行您的 EnterPressed 方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM