简体   繁体   中英

Keybinding a TextBox using XAML and WPF in C#

I'm trying to bind to a key event in a WPF UserControl. The component is a TextBox and my XAML is

<TextBox Name="textBarCode" Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="2" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0,0,10,0"  Width="300">
    <TextBox.InputBindings>
        <KeyBinding Key="Enter" Command="{Binding ImportPanel.BarcodeTextEnterKeyCommand}"/>
        <KeyBinding Key="Tab" Command="{Binding ImportPanel.BarcodeTextTabKeyCommand}"/>
    </TextBox.InputBindings>
</TextBox>

I'm not sure if it is needed or not but the namespace declaration is

<UserControl x:Class="Scimatic.Samples.Actions.ImportPanel"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ig="http://schemas.infragistics.com/xaml" 
    xmlns:components="clr-namespace:Scimatic.Mondrian.Components;assembly=Mondrian"
    xmlns:sampleInventory="clr-namespace:Scimatic.Mondrian.Views.SampleInventory;assembly=Mondrian"
    xmlns:trackingTags="clr-namespace:Scimatic.Mondrian.Views.TrackingTags;assembly=Mondrian">

The code that declares the command in the underlying xaml.cs file is

_barcodeKeyCommand = new ActionCommand(() =>
{
    if (!_parent && FocusableTagOnBarcode != null)
    {
        trackingInfo.SetFocusOnTag(FocusableTagOnBarcode);
    }
    else
    {
    buttonImport.Focus();
    }
});

The code that sets these properties is:

/// <summary>
/// The command property for the enter key in the barcode text box
/// </summary>
public ICommand BarcodeTextTabKeyCommand
{
    get
    {
        return _barcodeKeyCommand;
    }
}

The commands are returned in the same class using the same method:

/// <summary>
/// The command property for the enter key in the barcode text box
/// </summary>
public ICommand BarcodeTextEnterKeyCommand
{
    get
    {
        return _barcodeKeyCommand;
    }
}

However no matter what I try (and I've tried all kinds of things); I just cannot get the command to be called. I've clearly done something wring but could someone please help me. I'm fairly new to C# and I've wasted two days trying to respond to an enter key in a text box!

Thank you in advance,

Regards,

Neil

Binding will look for a specified binding Path in current binding context. By default it will be current DataContext . You can change binding context by using either ElementName , Source or RelativeSource . So in your case, assuming that BarcodeTextEnterKeyCommand is a property of ImportPanel control, you can give your control some name and then change command binding

<UserControl 
    x:Class="Scimatic.Samples.Actions.ImportPanel"
    ...
    x:Name="myUserControl">
    <!-- ... -->
    <TextBox Name="textBarCode" ....>
        <TextBox.InputBindings>
            <KeyBinding Key="Enter" Command="{Binding ElementName=myUserControl, Path=BarcodeTextEnterKeyCommand}"/>
            <KeyBinding Key="Tab" Command="{Binding ElementName=myUserControl, Path=BarcodeTextEnterKeyCommand}"/>
        </TextBox.InputBindings>
    </TextBox>
    <!-- ... -->
</UserControl>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM