Двухстороннее связывание TextBox не обновляется до тех пор, пока WP7 не потерял фокус - PullRequest
43 голосов
/ 06 апреля 2011

У меня есть страница с некоторыми текстовыми полями для ввода данных.Привязка текстового поля установлена ​​на TwoWay.Данные в моей модели представления обновляются только в том случае, если текстовое поле теряет фокус.Если я нажимаю кнопку, например «Сохранить», и текстовое поле остается в фокусе, изменения в текстовом поле не изменяются в моей модели представления при событии сохранения.привязка сохранить значение текстового поля, прежде чем он потеряет фокус?Или мне нужно что-то сделать в событии сохранения?

Ответы [ 8 ]

57 голосов
/ 07 апреля 2011

Я предполагаю, что ваша кнопка Сохранить - это ApplicationBarButton (не обычная кнопка). Для обычных кнопок это будет работать только потому, что они фокусируются и, следовательно, сработает привязка данных.

Для ApplicationBarButtons на телефоне это немного отличается, потому что они не отвлекают внимание от клиентского приложения. Чтобы обеспечить привязку данных при нажатии кнопки «Сохранить», вы можете добавить следующий код в ваш обработчик:

object focusObj = FocusManager.GetFocusedElement();
if (focusObj != null && focusObj is TextBox)
{
    var binding = (focusObj as TextBox).GetBindingExpression(TextBox.TextProperty);
    binding.UpdateSource();
}
16 голосов
/ 06 апреля 2011

Скачать бесплатную книгу Чарльза Петцольда Программирование Windows Phone 7 .На странице 387 он говорит о том, как это сделать.

По сути, установите для свойства UpdateSourceTrigger Binding значение Explicit.Затем в обратном вызове TextBox TextChanged обновите источник привязки.

8 голосов
/ 06 апреля 2011

Вы можете использовать поведение UpdateTextBindingOnPropertyChanged из библиотеки Prism для WP7 , чтобы обновить значение привязки при изменении текста вместо потери фокуса.

7 голосов
/ 06 апреля 2011

Я иду в направлении, противоположном @ преторианскому.

Ваш TextBox имеет значение по умолчанию UpdateSourceTrigger LostFocus. Это означает, что значение передается в ваше свойство ViewModel только тогда, когда оно теряет фокус.

Вы можете установить UpdateSourceTrigger в PropertyChanged:

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

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

Одно из значений UpdateSourceTrigger. По умолчанию используется значение по умолчанию, которое возвращает значение UpdateSourceTrigger по умолчанию свойства целевой зависимости. Тем не менее, значение по умолчанию для большинства свойства зависимости PropertyChanged, а текст свойство имеет значение по умолчанию LostFocus.

Имейте в виду, что это означает, что все, что инициируется обновлением этого свойства, будет происходить гораздо чаще (в основном при каждом нажатии клавиши, вместо одного "сброса", когда TextBox теряет фокус).

Надеюсь, это поможет!

6 голосов
/ 01 августа 2016

попытайтесь установить для свойства UpdateSourceTrigger значение PropertyChanged

как это

Property="{Binding PropertyBinding, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
6 голосов
/ 02 октября 2012

Вот быстрый ответ на решение Microsoft, предложенное Дереком. Вместо того, чтобы загружать и просеивать весь материал Prism, просто скопируйте этот класс в свой проект, а затем выполните шаги, чтобы активировать его:

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: я = "CLR-имена: System.Windows.Interactivity; сборка = System.Windows.Interactivity"
  3. Внутри XAML каждого TextBox, к которому вы хотите применить bahvior (который уже имеет привязку TwoWay к вашему исходному свойству), добавьте следующее:

    <я: Interaction.Behaviors>

    Примечание: префикс "my:" может отличаться в вашем коде. Это просто ссылка на пространство имен, куда вы добавили класс поведения.

1 голос
/ 06 апреля 2011

Я не пробовал ответить @ Praetorian, поэтому, если это работает хорошо, сделайте это - в противном случае используйте события KeyUp и TextChanged для обновления источника Binding.

0 голосов
/ 16 апреля 2013

Эта ссылка имеет решение, которое отлично работает в WinRT. Он наследует TextBox и добавляет новое свойство: BindableText.

http://www.familie -smits.com / запись / 2012/07/29 / UpdateSourceTrigger-в-WinRT.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...