«UpdateSourceTrigger = PropertyChanged» эквивалент для Windows Phone 7 TextBox - PullRequest
34 голосов
/ 29 января 2011

Есть ли способ получить TextBox в Windows Phone 7 для обновления привязки, когда пользователь печатает каждую букву, а не после потери фокуса?

Как и в следующем WPF TextBox:

<TextBox Text="{Binding Path=TextProperty, UpdateSourceTrigger=PropertyChanged}"/>

Ответы [ 8 ]

51 голосов
/ 29 января 2011

Silverlight для WP7 не поддерживает указанный вами синтаксис.Вместо этого выполните следующее:

<TextBox TextChanged="OnTextBoxTextChanged"
         Text="{Binding MyText, Mode=TwoWay,
                UpdateSourceTrigger=Explicit}" />

UpdateSourceTrigger = Explicit - это разумный бонус. Что это? Явное : Обновляет источник привязки только при вызове метода UpdateSource.Это экономит вам один дополнительный набор привязок, когда пользователь покидает TextBox.

В C #:

private void OnTextBoxTextChanged( object sender, TextChangedEventArgs e )
{
  TextBox textBox = sender as TextBox;
  // Update the binding source
  BindingExpression bindingExpr = textBox.GetBindingExpression( TextBox.TextProperty );
  bindingExpr.UpdateSource();
}
23 голосов
/ 29 января 2011

Мне нравится использовать прикрепленное свойство.На всякий случай, если вы в этих маленьких педерастах.

<toolkit:DataField Label="Name">
  <TextBox Text="{Binding Product.Name, Mode=TwoWay}" c:BindingUtility.UpdateSourceOnChange="True"/>
</toolkit:DataField>

А затем код поддержки.

public class BindingUtility
{
public static bool GetUpdateSourceOnChange(DependencyObject d)
{
  return (bool)d.GetValue(UpdateSourceOnChangeProperty);
}

public static void SetUpdateSourceOnChange(DependencyObject d, bool value)
{
  d.SetValue(UpdateSourceOnChangeProperty, value);
}

// Using a DependencyProperty as the backing store for …
public static readonly DependencyProperty
  UpdateSourceOnChangeProperty =
    DependencyProperty.RegisterAttached(
    "UpdateSourceOnChange",
    typeof(bool),
              typeof(BindingUtility),
    new PropertyMetadata(false, OnPropertyChanged));

private static void OnPropertyChanged (DependencyObject d,
  DependencyPropertyChangedEventArgs e)
{
  var textBox = d as TextBox;
  if (textBox == null)
    return;
  if ((bool)e.NewValue)
  {
    textBox.TextChanged += OnTextChanged;
  }
  else
  {
    textBox.TextChanged -= OnTextChanged;
  }
}
static void OnTextChanged(object s, TextChangedEventArgs e)
{
  var textBox = s as TextBox;
  if (textBox == null)
    return;

  var bindingExpression = textBox.GetBindingExpression(TextBox.TextProperty);
  if (bindingExpression != null)
  {
    bindingExpression.UpdateSource();
  }
}
}
5 голосов
/ 29 января 2011

Не с помощью синтаксиса привязки, нет, но без этого достаточно просто. Вы должны обработать событие TextChanged и вызвать UpdateSource для привязки.

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    ((TextBox) sender).GetBindingExpression( TextBox.TextProperty ).UpdateSource();
}

Это может быть легко преобразовано в прикрепленное поведение .

1 голос
/ 24 августа 2012

Вы можете написать свое собственное поведение TextBox для обработки обновлений TextChanged:

Это мой пример для PasswordBox, но вы можете просто изменить его для обработки любого свойства любого объекта.

public class UpdateSourceOnPasswordChangedBehavior
     : Behavior<PasswordBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.PasswordChanged += OnPasswordChanged;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.PasswordChanged -= OnPasswordChanged;
    }

    private void OnPasswordChanged(object sender, RoutedEventArgs e)
    {
        AssociatedObject.GetBindingExpression(PasswordBox.PasswordProperty).UpdateSource();
    }
}

Ussage:

<PasswordBox x:Name="Password" Password="{Binding Password, Mode=TwoWay}" >
    <i:Interaction.Behaviors>
        <common:UpdateSourceOnPasswordChangedBehavior/>
    </i:Interaction.Behaviors>
</PasswordBox>
1 голос
/ 29 января 2011

В вызове события TextChanged UpdateSource () .

BindingExpression be = itemNameTextBox.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();
0 голосов
/ 02 декабря 2013

Я взял ответ Преториана и создал класс расширения, который наследует TextBox, чтобы вам не пришлось путать код вашего представления с этим поведением.

C-Sharp :

public class TextBoxUpdate : TextBox
{
    public TextBoxUpdate()
    {
        TextChanged += OnTextBoxTextChanged;
    }
    private void OnTextBoxTextChanged(object sender, TextChangedEventArgs e)
    {
        TextBox senderText = (TextBox)sender;
        BindingExpression bindingExp = senderText.GetBindingExpression(TextBox.TextProperty);
        bindingExp.UpdateSource();
    }
}

VisualBasic :

Public Class TextBoxUpdate : Inherits TextBox

    Private Sub OnTextBoxTextChanged(sender As Object, e As TextChangedEventArgs) Handles Me.TextChanged
        Dim senderText As TextBox = DirectCast(sender, TextBox)
        Dim bindingExp As BindingExpression = senderText.GetBindingExpression(TextBox.TextProperty)
        bindingExp.UpdateSource()
    End Sub

End Class

Затем позвоните так в XAML :

<local:TextBoxUpdate Text="{Binding PersonName, Mode=TwoWay}"/>
0 голосов
/ 29 июня 2012

Это всего лишь одна строка кода!

(sender as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateSource();

Вы можете создать общее событие TextChanged (например, «ImmediateTextBox_TextChanged») в коде позади вашей страницы, а затем связать его с любым TextBox встр.

0 голосов
/ 26 июня 2012

UpdateSourceTrigger = Явное не работает для меня, поэтому я использую пользовательский класс, производный от TextBox

public class TextBoxEx : TextBox
{
    public TextBoxEx()
    {
        TextChanged += (sender, args) =>
                           {
                               var bindingExpression = GetBindingExpression(TextProperty);
                               if (bindingExpression != null)
                               {
                                   bindingExpression.UpdateSource();
                               }
                           };
    }

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