windows phone中点击ApplicatonBarIconButton不能使TextBox失去焦点的问题(涉及到Twoway绑定)...

现在这个版本(芒果)的window phone sdk中,如果页面上放置一个TextBox,点击ApplicatonBarIconButton后,TextBox的焦点并不会失去,这个不知道算不算是一个Bug,但是确实给开发带来了一些不便,特别涉及到twoway绑定的时候。

WP的TextBox的Text绑定属性UpdateSourceTrigger只有两个值:Default和Explicit,默认当然是Default了,这个Default代表的就是当TextBox失去焦点的时候,才会去改变通过TwoWay方式绑定的ViewModel中的属性。

       WP的这种绑定策略会给一些开发带来不便。比如一个页面中一个TextBox通过Twoway的方式绑定到ViewModel的一个属性上,改变TextBox的值,然后点击ApplicatonBarIconButton按钮保存刚才TextBox的值。预期应该是能够保存的,但是结果是并没有保存。主要原因还是点击ApplicatonBarIconButton后TextBox并没有失去焦点,所以也就不会去改变ViewModel中的绑定属性的值。

上面啰嗦的说了一大堆,其实就是主要的问题就在点击 ApplicatonBarIconButton后TextBox没有失去焦点。

下面记录一下几种解决方法。

1、设置 UpdateSourceTrigger属性的值为Explicit,然后给这个TextBox添加TextChanged事件,在TextChanged事件中更新TextBox的值。代码如下:

private void OnTextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)

{
   TextBox textBox = sender  as TextBox;
    if (textBox !=  null)
     {
        BindingExpression bindingExpr = textBox.GetBindingExpression(TextBox.TextProperty);
         if (bindingExpr !=  null)
          {
             bindingExpr.UpdateSource();
          }
     }

 } 

这种方案,大家一看就明白了,就是只要TextBox中文字改变就更新绑定,这个可以解决失去焦点后不能获得绑定的问题,但是如果你的应用程序不需要TextBox每次改变都要处理的话,这种方法就有点太...

 2、这种方法的原理和1一样,但是处理方式有点区别。那就是在页面中写一个方法专门处理TextBox绑定的问题。然后在ApplicatonBarIconButton的Click事件中调用这个方法,这样可以只执行一次更新。方法代码如下:

 // 处理textbox的焦点问题

         private  void BindCurrentTextBox()
        {
            TextBox textBox = FocusManager.GetFocusedElement()  as TextBox;
             if (textBox !=  null)
            {
                BindingExpression be = textBox.GetBindingExpression(TextBox.TextProperty);
                 if (be !=  null)
                {
                    be.UpdateSource();
                }
            }
        }

 大家应该发现这个方法中的代码和上面的差不多,哈哈,就是差不多,原理都是一样的,就是处理的位置不一样而已。

然后在 ApplicatonBarIconButton的Click事件中,在需要处理和绑定属性相关的方法之前调用这个方法就可以了。

 

 

其实以上两个方法,并没有解决掉点击 ApplicatonBarIconButton之后TextBox没有失去焦点的问题,只是通过其他方法在点击之后能很好的获得TextBox的值。

 (以上方法并非个人原创,本人只是收集整理一下)

如果大家有什么更好的方法,请不吝赐教,先谢谢了。 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/acles/archive/2012/03/29/2422522.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值