如何使用ICommand在MVVM中触发KeyUp事件

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

我已经创建了这个简单的视图:

enter image description here

现在,当光标位于这两个文本框之一内时,当我按RETURN键时,我希望触发“搜索” = SEARCH按钮(KeyUp事件)。

我知道如何在后面的代码中轻松地执行此操作,但是我想使用ICommand在MVVM(在我的视图模型类中)执行此操作。在后面的代码中,我使用了(自动生成的)KeyEventArgs参数。

我使用ICommand在MVVM中进行了尝试,但是Command方法给我一个错误,声称我需要为KeyEventArgs参数实例化一个对象。在后面的代码中(类似于非mvvm),我不需要实例化任何东西,因为KeyEventArgs参数就像该方法一样是“自动生成的”。因此,我不必为此担心。

我如何使KeyUp事件在我的MVVM项目中工作?为了回答这个问题,我为您提供了以下缩短的代码:

XAML视图:

 <StackPanel Height="423" VerticalAlignment="Bottom">
        <Label Name="lblArtikelbezeichnung" Content="Artikelbezeichnung:" Margin="20, 20, 20, 0"></Label>
        <TextBox Name="txtArtikelbezeichnung" 
                 Width="Auto" 
                 Margin="20, 0, 20, 0"
                 IsEnabled="{Binding BezEnabled}"
                 Text="{Binding BezText}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="TextChanged">
                    <i:InvokeCommandAction Command="{Binding TextChangedBez}" />
                </i:EventTrigger>
                <i:EventTrigger EventName="KeyUp">
                    <i:InvokeCommandAction Command="{Binding KeyUpBez}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </TextBox>
        <!--TextChanged="txtArtikelbezeichnung_TextChanged" 
                 KeyUp="txtArtikelbezeichnung_KeyUp"-->
        <Label Name="lblLieferant" Content="Lieferant:" Margin="20, 0, 20, 0"></Label>
        <TextBox Name="txtLieferant" 
                 Width="Auto" 
                 Margin="20, 0, 20, 0"
                 IsEnabled="{Binding LiefEnabled}"
                 Text="{Binding LiefText}">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="TextChanged">
                    <i:InvokeCommandAction Command="{Binding TextChangedLief}" />
                </i:EventTrigger>
                <i:EventTrigger EventName="KeyUp">
                    <i:InvokeCommandAction Command="{Binding KeyUpLief}" />
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </TextBox>
            <!--TextChanged="txtLieferant_TextChanged" 
                 KeyUp="txtLieferant_KeyUp"-->
        <Button Name="btnSuchen" 
                Content="Suchen" 
                Width="100" Height="25" 
                Margin="20, 10,240, 10" 
                Command="{Binding GefilterteSuche}">
        </Button>
...
<StackPanel>

背后的代码:

    using System.Windows;

    namespace Lieferscheine
    {
        /// <summary>
        /// Interaktionslogik für artikelHinzu.xaml
        /// </summary>
    public partial class artikelHinzu : Window
    {

        public artikelHinzu()
        {
            InitializeComponent();
            DataContext = new ArtikelHinzuViewModel();
        }     
    }
}

查看模型:

    public class ArtikelHinzuViewModel : INotifyPropertyChanged
    {              
//ICommands (shortened)
        public ICommand GefilterteSuche => new DelegateCommand<object>(SucheArtikel);                     
        public ICommand KeyUpLief => new DelegateCommand<KeyEventArgs>(KeyUpLieferant);       
        public ICommand KeyUpBez => new DelegateCommand<KeyEventArgs>(KeyUpBezeichnung);

 //INotifyPropertyChanged      
        public event PropertyChangedEventHandler PropertyChanged;
        public virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        //Konstruktor
        public ArtikelHinzuViewModel()
        {

        }

//ICommand methods (shortened for reasons of simplicity)        

         //KeyUp Events (THIS PART IS MY PROBLEM)      
        private void KeyUpBezeichnung(KeyEventArgs e) //the argument is obligatory but it does not have an instantiated object which is why an error fires...
        {
//since I need to create an object for KeyEventArgs I tried this but it is useless...
        /*e = new KeyEventArgs(Keyboard.PrimaryDevice,
        Keyboard.PrimaryDevice.ActiveSource,
        0, Key.Back);
//I need to access this e.Key property but don't know how in my case! That is the actual problem...
            if (e.Key == Key.Return)
            {
                object o = new object();
                SucheArtikel(o);
            }
            */
        }
//same problem here as above...
        private void KeyUpLieferant(KeyEventArgs e)
        {
            /*
        e = new KeyEventArgs(Keyboard.PrimaryDevice,
        Keyboard.PrimaryDevice.ActiveSource,
        0, Key.Back);

            if (e.Key == Key.Return)
            {
                object o = new object();
                SucheArtikel(o);
            }
             */
        }

    }

我已经创建了这个简单的视图:现在,当光标在这两个文本框之一内时,当我按RETURN键时,我希望触发“搜索” = SEARCH按钮(KeyUp事件)。我知道该如何...

c# wpf mvvm data-binding icommand
1个回答
0
投票

使用InputBindings更容易:

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