none
MVVM模式TextBox InvokeCommandAction时 Text的绑定值在ViewModel中获取不到 RRS feed

  • 问题

  • 主要思路: TextBox 中扫描条形码(等同键盘输入),在回车的时候获取TextBox的输入值,采用MVVM模式绑定Text和Command;

    在不采用MVVM模式时这个很好处理,Keydown事件里可以判断回车,并获取Text的值;

    然而采用MVVM模式时回车绑定到ViewModel的Command,Text值同样绑定到ViewModel的属性,但是就是获取不到;

    MSDN上查到的资料是说TextBox的Text绑定值获取时在离开控件时获取,然后我试验外加一个Button,把Button绑定到ViewModel的Command是可以获取到TextBox的Text值,但是这样的话,条形码扫描就会有问题(条码扫描类似输入字符后自动回车),所以必须使用TextBox自身的回车;

    问:怎么写才能让TextBox在自身绑定回车的情况下获取到输入的Text值,最好能保持使用MVVM模式;

    代码如下:

    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:ei="clr-namespace:Microsoft.Expression.Interactivity.Input;assembly=Microsoft.Expression.Interactions"
    <TextBox x:Name="Barcode" Text="{Binding Path=Barcode}">
    	<i:Interaction.Triggers>
    		<ei:KeyTrigger FiredOn="KeyDown" Key="Enter">
    			<i:InvokeCommandAction Command="{Binding Path=ScanCommand}"/>
    		</ei:KeyTrigger>
    	</i:Interaction.Triggers>
    </TextBox>

    ViewModel代码:

    class ScanViewModel
    {
    	public DelegateCommand ScanCommand { get; set; }
    	private string _barcodeValue;
    
    	public string Barcode
    	{ 
               set { _barcodeValue = value; }
    	}
    
    	public ScanViewModel()
    	{
              this.ScanCommand = new DelegateCommand();
              this.ScanCommand.ExecuteCommand = new Action<object(this.Scan);
    	}
    
            private void Scan(object obj)
            {
                //Command事件
            }
    }

    DelegateCommand代码:

    class DelegateCommand : ICommand
        {
            //A method prototype without return value.
            public Action<object> ExecuteCommand = null;
            //A method prototype return a bool type.
            public Func<object, bool> CanExecuteCommand = null;
            public event EventHandler CanExecuteChanged;
    
            public bool CanExecute(object parameter)
            {
                if (CanExecuteCommand != null)
                {
                    return this.CanExecuteCommand(parameter);
                }
                else
                {
                    return true;
                }
            }
    
            public void Execute(object parameter)
            {
                if (this.ExecuteCommand != null) this.ExecuteCommand(parameter);
            }
    
            public void RaiseCanExecuteChanged()
            {
                if (CanExecuteChanged != null)
                {
                    CanExecuteChanged(this, EventArgs.Empty);
                }
            }
        }

    2015年11月6日 2:33

全部回复

  • 既然用了绑定还处理事件做什么?直接在绑定值,也就是Text依赖项属性改变时处理回调不就行了么。
    你说的没错,但是条形码扫描录入过程中字符是依次一个一个字母输入的(只是速度很快),只绑定Text值的话,无法确定什么情况下条码是完整的,大部分扫描抢是会在最后输入完最后一个字符后回车,所以我读取条码是检测回车事件的。
    2015年11月6日 8:56
  •  您好,我在博客园里写了一篇文章,不知能否给您一些灵感:http://www.cnblogs.com/hippieZhou/p/4940512.html,希望我的解答对您有所帮助,谢谢!
    • 已建议为答案 HippieZhou 2015年11月6日 14:00
    2015年11月6日 14:00
  •  您好,我在博客园里写了一篇文章,不知能否给您一些灵感:http://www.cnblogs.com/hippieZhou/p/4940512.html,希望我的解答对您有所帮助,谢谢!
    文章很好,谢谢,但没有解决我的问题 (~_~).
    2015年11月10日 8:12
  • 你好,

    请试下加上Mode="TwoWay"

    <TextBox x:Name="Barcode" Text="{Binding Path=Barcode, Mode=TwoWay}">


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.


    2015年11月20日 3:38
    版主
  • 加上Mode="TwoWay" 无效;目前测试下来,焦点不离开 TextBox 控件是无法获取到值的。
    2015年12月14日 3:13
  • <TextBoxName="UserNameText"Text="{Binding Path=Username, UpdateSourceTrigger=PropertyChanged}"/>

    引用https://blog.csdn.net/swarb/article/details/86179829

    2020年8月31日 9:44
  • hi 夕阳

      有两个问题需要确认:

      1、Barcode按你的描述绑定的方式是什么? Update的触发方式是什么样的?是否自验证过?是否满足需求

      2、回车键按下后是否触发命令?

      个人觉得把上面的问题弄清楚后就没有上面问题了,问题其实并不难。

    2020年9月8日 4:29