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/p/2422522.html