单击ApplicationBar中的按钮时,TextBox的双向数据绑定不会更新

时间:2011-11-17 14:35:07

标签: windows-phone-7 mvvm

我的应用中有一个TextBoxApplicationBarIconButton中有一个ApplicationBar,其中TextBox的内容充当“提交”。

使用虚拟键盘编辑TextBox时,ApplicationBarIconButton仍然可以在SIP下方看到,因此您可以直接提交而无需关闭键盘:很好!

但是,点击按钮时,TextBox绑定到的视图模型会更新。

我发现其他人遇到了同样的问题here,他们使用了在TextBox的{​​{1}}事件中手动更新viewmodel的非常讨厌的解决方法。

删除使用数据绑定视图模型的所有优雅!

这是WP7中的错误吗?

或者有没有更好的方法可以解决这个问题呢?

3 个答案:

答案 0 :(得分:13)

问题是silverlight绑定不支持UpdateSourceTrigger的PropertyChanged值。这意味着默认情况下,当TextBox失去焦点时,TextBox将更新绑定到Text的属性,唯一的另一种可能性是在代码中显式更新它,如链接中的示例所示。

这里只有两个选项:单击按钮时更新绑定,或单击按钮时从TextBox中移除焦点。

我通常会更新TextChanged事件的绑定。我使用扩展方法来执行此操作:

public static void UpdateBinding(this TextBox textBox)
{
    BindingExpression bindingExpression = 
            textBox.GetBindingExpression(TextBox.TextProperty);
    if (bindingExpression != null)
    {
            bindingExpression.UpdateSource();
    }
}

允许我在后面的代码中调用它:

textBox.UpdateBinding();

您也可以使用自定义行为。

答案 1 :(得分:1)

允许绑定对文本框的每个按键起作用的步骤的摘要,而不仅仅是当文本框失去焦点时。使用棱镜。这是对原始问题的略微间接的解决方案。

  • 在NuGet包管理器中,搜索Prism。添加由“Microsoft模式和实践”

  • 创建的“Prism.Phone”
  • 将以下内容添加到页面的电话:PhoneApplicationPage标记

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" xmlns:prismInteractivity="clr-namespace:Microsoft.Practices.Prism.Interactivity;assembly=Microsoft.Practices.Prism.Interactivity"

  • 为文本框添加单独的结束标记,并在开始和结束的TextBox标记之间添加以下内容

<i:Interaction.Behaviors> <prismInteractivity:UpdateTextBindingOnPropertyChanged/> </i:Interaction.Behaviors>

答案 2 :(得分:0)

我想这会有效,但你应该检查一下是否真的有必要使用 ApplicationBarIconButton (或只是页面上的一个按钮)。

如果您希望在应用中设置良好的 Metro 设计,应该避免使用此,您可能更喜欢使用InputScope =&#34; Search&#34; +使用Page.Focus()

轻松完成隐藏SIP

e.g。 (一篇旧文章; InputScope =&#34;搜索&#34;为我工作) http://4mkmobile.com/2011/02/wp7-devs-stop-adding-search-buttons/

另请参阅:http://forums.create.msdn.com/forums/p/70506/619517.aspx#619517

private void SearchTextBox_KeyUp(object sender,KeyEventArgs e)处理程序:

  1. 使用InputScope =&#34;搜索&#34;对于我的搜索字段
  2. 使用DataBinding Mode = TwoWay
  3. 焦点(); //隐藏SIP
  4. UpdateBinding(SearchTextBox); //这里提到的技巧
  5. App.ViewModel.ExecuteSearch();
  6. 在我的MVVM应用程序中运行良好。