文本框绑定双向不会更新,直到焦点丢失WP7

我有一个文本框的数据input页面。 文本框的绑定设置为TwoWay 。 我的视图模型中的数据只有在文本框失去焦点时才会更新。 如果我点击一个button(如保存),并且文本框仍然有焦点,则保存事件的视图模型中的文本框中的更改不会更改。

有没有办法让绑定保存文本框的值失去焦点之前? 或者我需要在保存事件中做些什么?

您可以使用Prism Library for WP7中的UpdateTextBindingOnPropertyChanged行为在文本更改而不是丢失焦点时更新绑定值。

我假设你的保存button是一个ApplicationBarButton(不是一个普通的button)。 对于正常的button,它会正常工作,因为他们需要重点,因此数据绑定将踢。

对于手机上的ApplicationBarButtons,它有点不同,因为它们不会将焦点从客户端应用程序中移除。 为了确保在单击“保存”button时可以启用数据绑定,可以在处理程序中添加以下代码:

 object focusObj = FocusManager.GetFocusedElement(); if (focusObj != null && focusObj is TextBox) { var binding = (focusObj as TextBox).GetBindingExpression(TextBox.TextProperty); binding.UpdateSource(); } 

下载Charles Petzold免费的Windows Phone 7编程书。 他在第387页谈到如何做到这一点。

基本上,将BindingUpdateSourceTrigger属性设置为Explicit 。 然后,在TextBoxTextChangedcallback中,更新绑定源。

我正朝着@Praetorian的相反方向前进。

您的TextBox具有LostFocus的默认UpdateSourceTrigger值。 这意味着只有当它失去焦点时才会将值推送到ViewModel属性。

您可以将UpdateSourceTrigger设置为PropertyChanged:

 <TextBox UpdateSourceTrigger="PropertyChanged" Text="{Binding TextViewModelProperty}" /> 

http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger.aspx

其中一个UpdateSourceTrigger值。 缺省值是Default,它将返回目标依赖项属性的默认UpdateSourceTrigger值。 但是,大多数依赖属性的默认值是PropertyChanged,而Text属性的默认值是LostFocus。

请记住,这意味着任何触发此属性的更新将触发更频繁(基本上每个按键,而不是一个单一的“刷新”,当TextBox失去焦点)。

希望有所帮助!

以下是Derekbuild议的Microsoft解决scheme的快速访问答案。 而不是下载和筛选所有棱镜的东西,只要复制这个类到你的项目,然后按照以下步骤来激活它:

UpdateBindingOnPropertyChangedBehviour.cs

 using System; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Interactivity; namespace MyCompany.MyProduct { /// <summary> /// Custom behavior that updates the source of a binding on a text box as the text changes. /// </summary> public class UpdateTextBindingOnPropertyChanged : Behavior<TextBox> { /// <summary> /// Binding expression this behavior is attached to. /// </summary> private BindingExpression _expression; /// <summary> /// Called after the behavior is attached to an AssociatedObject. /// </summary> /// <remarks> /// Override this to hook up functionality to the AssociatedObject. /// </remarks> protected override void OnAttached() { base.OnAttached(); // Hook events to change behavior _expression = AssociatedObject.GetBindingExpression(TextBox.TextProperty); AssociatedObject.TextChanged += OnTextChanged; } /// <summary> /// Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred. /// </summary> /// <remarks> /// Override this to unhook functionality from the AssociatedObject. /// </remarks> protected override void OnDetaching() { base.OnDetaching(); // Un-hook events AssociatedObject.TextChanged -= OnTextChanged; _expression = null; } /// <summary> /// Updates the source property when the text is changed. /// </summary> private void OnTextChanged(object sender, EventArgs args) { _expression.UpdateSource(); } } } 

这基本上是Microsoft Prism 4.1代码的清理版本(如果要浏览其余部分,请参阅Silverlight \ Prism.Interactivity项目)。

现在如何使用它:

  1. 将对System.Windows.Interactivity程序集的引用添加到您的Windows Phone项目。
  2. 在要使用该行为的每个页面中,将XAML引用添加到程序集中:xmlns:i =“clr-namespace:System.Windows.Interactivity; assembly = System.Windows.Interactivity”
  3. 在你想应用bahvior的每个TextBox的XAML里面(已经有一个TwoWay绑定到你的源属性),添加如下内容:

    <I:Interaction.Behaviors>
    <my:UpdateTextBindingOnPropertyChanged />
    </i:Interaction.Behaviors>

    注意:“my:”前缀在代码中可能不同。 这只是添加行为类的名称空间引用。

尝试将UpdateSourceTrigger属性设置为“PropertyChanged”

喜欢这个

 Property="{Binding PropertyBinding, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 

我还没有尝试@ Praetorian的答案,所以如果这样做的话,那么做 – 否则,同时使用KeyUp和TextChanged事件来更新绑定源。

这个链接有一个在WinRT中完美运行的解决scheme。 他inheritance了TextBox并添加了一个新的属性:BindableText。

http://www.familie-smits.com/post/2012/07/29/UpdateSourceTrigger-in-WinRT.aspx