zoukankan      html  css  js  c++  java
  • 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的值。

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

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

  • 相关阅读:
    页脚保持在未满屏页面的底部
    jquery tab选项卡
    Unity 物体在屏幕内跟随鼠标移动
    Unity 中一些图形学知识
    Unity 简单的第三人称视角
    Unity 一个简单的鼠标跟随
    Unity常用操作代码
    3D渲染管线
    教你如何利用threejs对3D模型皮肤进行DIY
    从Maya中把模型搬运至网页的过程
  • 原文地址:https://www.cnblogs.com/acles/p/2422522.html
Copyright © 2011-2022 走看看