簡體   English   中英

TextBox KeyDown觸發器事件不適用於Backspace和Delete鍵

[英]TextBox KeyDown Trigger Event not working for Backspace and Delete key

我有一個文本框,對於該文本框,我附加了一個keydown事件。 一切正常,但我注意到當我按下“Backspace”和“Delete”鍵時,沒有調用綁定命令。

我的查看xaml文件: -

<TextBox x:Name="textBox" Width="500" Text="{Binding TextBoxText, UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Triggers>                
    <i:EventTrigger EventName="KeyDown">  
        <cmd:EventToCommand Command="{BindingPath=TextBoxKeyDownEvent}" PassEventArgsToCommand="True" />                
    </i:EventTrigger>            
</i:Interaction.Triggers>
</TextBox>

我的ViewModel cs文件: -

    //TextBox Key Down Event Handler
    private DelegateCommand _textBoxKeyDownEvent;
    public ICommand TextBoxKeyDownEvent
    {
        get
        {
            if (_textBoxKeyDownEvent == null)
            {
                _textBoxKeyDownEvent = new DelegateCommand(TextBoxKeyDownEventHandler);
            }
            return _textBoxKeyDownEvent;
        }
        set { }
    }

有人可以給我一些建議

編輯:你必須使用PreviewKeyDown它的工作原理。 不會在Space和Delete上觸發KeyDown。 如果忽略MVVM並將KeyDown的處理程序置於代碼隱藏中,它也將失敗


如何將Text-Property綁定到viewmodel中的字符串?

我構建了一個快速,簡單的例子。

結果

左側TextBox中的文本只是填充到右側的Textblock。

在此輸入圖像描述

視圖

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Orientation="Horizontal">
        <TextBox Text="{Binding TextBoxValue, UpdateSourceTrigger=PropertyChanged}"  Width="250"/>
        <StackPanel Orientation="Horizontal">
            <TextBlock>"</TextBlock>
            <TextBlock Text="{Binding TextBoxValue, UpdateSourceTrigger=PropertyChanged}" />
            <TextBlock>"</TextBlock>
        </StackPanel>
    </StackPanel>
</Window>

視圖模型

public class MainWindowViewModel : INotifyPropertyChanged
{
    private string textBoxValue;

    public string TextBoxValue
    {
        get { return textBoxValue; }
        set
        {
            textBoxValue = value;
            OnTextBoxValueChanged();
            RaisePropertyChanged();
        }
    }

    void OnTextBoxValueChanged()
    {
        // you logic here, if needed.
    }

    #region INotifyPropertyChanged implementation

    public event PropertyChangedEventHandler PropertyChanged;

    void RaisePropertyChanged([CallerMemberName] string propertyName = null)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion
}

你最常使用的是PreviewKeyDown事件。

像這樣:

 <EventSetter Event="PreviewKeyDown" Handler="TextBox_PreviewKeyDown"/>

編輯 :您是正確的 - 不執行默認行為。 您應該使用ec8ors解決方案,無論如何都要好得多:

<TextBox x:Name="textBox" Width="500" Text="{Binding TextBoxText, UpdateSourceTrigger=PropertyChanged}">
    <i:Interaction.Triggers>
       <i:EventTrigger EventName="PreviewKeyDown">
           <i:InvokeCommandAction Command="{Binding TextBoxKeyDownEvent, Mode=OneWay}"/>
       </i:EventTrigger>
    </i:Interaction.Triggers>
</TextBox>

原始 :您可以使用InputBindings在按下“特殊”鍵時調用您的命令:

<TextBox x:Name="textBox" Width="500" Text="{Binding TextBoxText, UpdateSourceTrigger=PropertyChanged}">
  <i:Interaction.Triggers>                
      <i:EventTrigger EventName="KeyDown">  
          <cmd:EventToCommand Command="{BindingPath=TextBoxKeyDownEvent}" PassEventArgsToCommand="True" />                
      </i:EventTrigger>            
   </i:Interaction.Triggers>

   <TextBox.InputBindings>
      <KeyBinding Command="{Binding TextBoxKeyDownEvent}" Key="Delete" />
      <KeyBinding Command="{Binding TextBoxKeyDownEvent}" Key="Back" />
   </TextBox.InputBindings>
</TextBox>

暫無
暫無

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

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