我的应用中有一个TextBox
,ApplicationBarIconButton
中有一个ApplicationBar
,其中TextBox
的内容充当“提交”。
使用虚拟键盘编辑TextBox
时,ApplicationBarIconButton
仍然可以在SIP下方看到,因此您可以直接提交而无需关闭键盘:很好!
但是,点击按钮时,TextBox
绑定到的视图模型会不更新。
我发现其他人遇到了同样的问题here,他们使用了在TextBox
的{{1}}事件中手动更新viewmodel的非常讨厌的解决方法。
删除使用数据绑定视图模型的所有优雅!
这是WP7中的错误吗?
或者有没有更好的方法可以解决这个问题呢?
答案 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模式和实践”
将以下内容添加到页面的电话: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"
<i:Interaction.Behaviors>
<prismInteractivity:UpdateTextBindingOnPropertyChanged/>
</i:Interaction.Behaviors>
答案 2 :(得分:0)
我想这会有效,但你应该检查一下是否真的有必要使用 ApplicationBarIconButton (或只是页面上的一个按钮)。
如果您希望在应用中设置良好的 Metro 设计,应该避免使用此,您可能更喜欢使用InputScope =&#34; Search&#34; +使用Page.Focus()
轻松完成隐藏SIPe.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)处理程序:
在我的MVVM应用程序中运行良好。