• 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的值。

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

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

  • 相关阅读:
    前端面试题精选
    闭包、作用域、THIS、OOP
    Ubuntu,debian一键安装Mariadb
    两条命令实现nodejs快速安装
    HTML 5的革新——语义化标签section和article的区别
    uni-app之uni.showToast()image路径问题
    vue-cli4配置文件别名
    蓝湖使用方法
    Node组件——Express简介
    程序员最深情的告白——《致对象》
  • 原文地址:https://www.cnblogs.com/acles/p/2422522.html
Copyright © 2020-2023  润新知