2013-06-13 3 views
1

Я привязываю TextBox к собственности моего ViewModel. Когда пользователь нажимает кнопку ApplicationBar, вызывается команда (я использую BindableApplicationBar, который можно найти на NuGet). Проблема заключается в том, что когда пользователь вводит в TextBox и сразу же нажимает кнопку приложения, установщик TextBox не вызывается, а это означает, что ButtonCommand использует старый текст.LostFocus перед командой ApplicationBar

Я видел много решений, но я не могу использовать их в своей ситуации. Единственное «решение» - это избавиться от ApplicationBar и вместо этого использовать кнопку, расположенную за клавиатурой (которая появляется, когда пользователь нажимает на TextBox. Я использую Windows Phone, поэтому именно здесь есть KeyBoard. ..). Поэтому пользователю нужно щелкнуть в другом месте, чтобы использовать кнопку -> lostfocus.

Некоторые решения:

WPF Databind Before Saving

Binding with UpdateSourceTrigger==LostFocus do not fire for Menu or Toolbar interaction

Я не могу использовать UpdateSourceTrigger = PropertyChanged, и я использую MVVM, поэтому я не очень хочу использовать CodeBehind. Если нет другого способа сделать это без CodeBehind, тогда все в порядке.

ответ

0

Одним из решений, которое я использовал в прошлом, является обновление привязки всякий раз, когда содержимое текстового поля изменяется, а не когда фокус теряется.

Простой, многоразовый способ сделать это с поведением.

Что-то вроде этого:

public class RebindOnTextChanged : Behavior<TextBox> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 
     this.AssociatedObject.TextChanged += this.TextChanged; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     this.AssociatedObject.TextChanged -= this.TextChanged; 
    } 

    private void TextChanged(object sender, TextChangedEventArgs e) 
    { 
     var bindingExpression = this.AssociatedObject.GetBindingExpression(TextBox.TextProperty); 
     if (bindingExpression != null) 
     { 
      bindingExpression.UpdateSource(); 
     } 
    } 
}  

и используется как:

<TextBox Text="{Binding SomeProperty}"> 
    <i:Interaction.Behaviors> 
     <behaviours:RebindOnTextChanged /> 
    </i:Interaction.Behaviors> 
</TextBox> 
0

Проблема (или ошибка в рамках?), Которая возникает здесь, заключается в том, что AppBar не является реальным элементом управления Silverlight, поэтому он обрабатывается по-разному с точки зрения кражи фокуса. Я не уверен, как это вписывается в ваш дизайн, но в одном из моих приложений, которые я использовал следующий шаблон:

void appBarButton_Click(object sender, EventArgs e) 
    { 
     // removal of focus from the TextBox to the Page will force the bind. 
     this.Focus(); 

     // wait till the next UI thread tick so that the binding gets updated 
     Dispatcher.BeginInvoke(() => 
     { 
      // at this point the binding is updated 
      MessageBox.Show(RandomText); 
     }); 
    } 

Это своего рода полная, но я использовал вспомогательную функцию, чтобы обернуть несколько различных путей, были поражены этим, так что им не нужно было знать о дополнительной отправке, или какой контроль собирался украсть фокус после нажатия кнопки.

Смежные вопросы