Silverlight 4里Textbox在失去焦点之前无法获取到Text值的另类解决方法
来源:互联网 发布:太极越狱没有网络 编辑:程序博客网 时间:2024/05/17 13:41
这个问题在Silverlight 5中可以通过在绑定语法里使用UpdateSourceTrigger.PropertyChanged实现,但是在Silverlight 4里没有这个选项。
通过谷歌查找了一番,发现大部分解决方法都是在TextBox的TextChanged事件里编写类似如下代码:
TextBox txt = sender as TextBox; var bindingExpression = txt.GetBindingExpression(TextBox.TextProperty); if (bindingExpression != null) { bindingExpression.UpdateSource(); }虽然这种方法也是可行的,但是由于我的情况比较特殊,TextBox控件在每个页面中的比重太大了,这样一个一个的添加事件有些得不偿失。于是我想通过测试看看有没有其他的办法。
在官方文档里描述当失去焦点时更新数据源,但是我试过几次都没有更新,虽然触发了TextBox的LostFocus事件。不过也让我发现了一个规律,就是如果失去焦点后等一会儿,那么数据源就会被更新。利用这一点我解决了我的问题。
我的需求是这样的:用户希望在TextBox里输入查询条件后,直接按下Enter键即可查询,而不需要再点击查询按钮。 在查询区域的容器上加上了KeyDown或KeyUp事件,代码如下:
private void SearchKeyUp(object sender, KeyEventArgs e) { if (e.Key != Key.Enter) return; var context = SynchronizationContext.Current; btnSearch.Focus(); //new Timer(state => context.Post(d=> SearchClick(btnSearch, new RoutedEventArgs()),null), null, 10, 0); ThreadPool.QueueUserWorkItem(state => context.Post(d => SearchClick(btnSearch, new RoutedEventArgs()), null)); }
btnSearch是查询按钮的名称,而SearchClick(object sender, RoutedEventArgs e)是查询按钮的点击处理事件函数。
这样当在查询区按下Enter时,会将事件传递到外层容器的KeyUp事件上并调用SearchKeyUp方法。在SearchKeyUp方法里,先让查询按钮获取焦点,然后使用定时器等待10毫秒后调用查询按钮事件,这样会让绑定引擎更新绑定的数据源,由此可以得到正确的查询条件进行查询。
我采用这种方法不能说是最好的,但对于我这种情况来说,修改是比较少的,因为我一个页面只是添加一个方法,而不是为那个页面里很多很多的TextBox控件添加TextChanged事件。
Xaml文件:
后台代码:
数据模型:
经过仔细研究Binding类结构,我找到了产生这个问题的一个原因。首先Binding类实现了ISupportInitialize接口,这个接口有两个方法BeginInit和EndInit,从它们的命名上可以看出,它们都是异步的。同时从开发文档上了解到BeginInit方法是用信号通知对象初始化即将开始,EndInit方法是用信号通知对象初始化已完成。由此可知,当TextBox失去焦点时,绑定引擎会调用BeginInit方法去通知实例的属性改变了,但是由于这是异步方法,当在调用EndInit方法前,主线程可能进行了其他处理导致无法马上执行EndInit方法,这样就造成了没有及时更新属性的现象。
在我这个例子里,当用户点击Enter按键后,查询按钮将会获取焦点,此时TextBox控件失去焦点并且触发BeginInit方法通知对象属性改变,因为是异步方法,所以主线程UI不会理会它并且继续执行SearchClick方法,直到SearchClick方法执行完成后,异步方法EndInit才会切换回主线程UI上,到此时属性值才发生变更,但是在执行SearchClick方法时属性值还没来得及进行更新,这应该就是底层数据绑定引擎做的工作。
以上只是我个人对数据绑定的理解,如果有不正确的地方还希望高人指正啦。
- Silverlight 4里Textbox在失去焦点之前无法获取到Text值的另类解决方法
- easyui textbox 失去焦点事件及获取文本框的内容
- C#TextBox 失去与获取焦点事件
- easyui-textbox的onblur失去焦点事件
- GridView中TextBox失去焦点或文本改变时更新本行(获取本行某列的值)
- 输入框的获取焦点、失去焦点
- 获取焦点, 失去焦点
- html text失去焦点与得到焦点的事件
- html text失去焦点与得到焦点的事件
- html text失去焦点与得到焦点的事件
- 如何使页面中所有的textbox失去焦点
- TextBox获得焦点与失去焦点
- 获取动态textbox的Text
- Win8 在TextBox中设置提示信息,当TextBox获得焦点时消失,失去时验证
- Activity 的 失去焦点 到销毁
- WPF 在TextBox失去焦点时检测数据,出错重新获得焦点解决办法
- WPF 在TextBox失去焦点时检测数据,出错重新获得焦点解决办法
- 在ListView里添加viewPager为header时,viewPager滑动失去焦点的解决办法
- Using Message Box (MsgBox) in Excel VBA
- 求1~n中与m互质的数的个数
- MySQL中进行树状所有子节点的查询
- 教你使用python获得字符串的md5值
- JAVA NIO 简介
- Silverlight 4里Textbox在失去焦点之前无法获取到Text值的另类解决方法
- FILE 文件结构体
- 分享比较好看的thinkphp二十多种分页样式
- 虚继承
- 待消化2:C语言的5种存储类以及关键字volatile、restrict
- Java NIO系列教程(一) Java NIO 概述
- JVM内存原理,weblogic内存的调优
- 编译hadoop-eclipse-plugin-1.1.2.jar插件
- WordPress简单三步自动显示缩略图(无插件)