2017-01-09 1 views
0

У меня есть TextBox определено в моем XAML как:обновление строки формата TextBox на потерянном фокусе

<TextBox x:Name="AmountDueTextBox" 
     Width="250" 
     RelativePanel.AlignLeftWith="BalanceTextBox" 
     RelativePanel.Below="BalanceTextBox" 
     Text="{x:Bind ViewModel.CurrentInvoice.AmountDue, 
         Mode=TwoWay, 
         Converter={StaticResource StringFormatConverter}, 
            ConverterParameter='{}{0:N}'}" /> 

Преобразователь применяется, когда я TAB из TextBox, но если я нажимаю прочь, строки не будет отформатирован автоматически. Я читал подобные вопросы, но не видел никакого решения. Как я уже упоминал, он работает правильно, когда выкладывается, но не нормально LostFocus.

Я использую шаблон 10 в универсальном проекте Windows. Вот StringFormatConverter из шаблона 10:

public class StringFormatConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     var format = (parameter as string) ?? Format; 
     if (format == null) 
      return value; 

     if(string.IsNullOrWhiteSpace(language)) 
     { 
      return string.Format(format, value); 
     }  

     try 
     { 
      var culture = new CultureInfo(language); 
      return string.Format(culture, format, value); 
     } 
     catch 
     { 
      return string.Format(format, value); 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     throw new NotImplementedException(); 
    } 

    public string Format { get; set; } 
} 

EDIT Добавлен пользовательский ConvertBack метод:

public object ConvertBack(object value, Type targetType, object parameter, string language) 
{ 
    if (value is string) 
    { 
     decimal returnDecimal; 
     if (decimal.TryParse(value as string, out returnDecimal)) 
     { 
      return returnDecimal; 
     } 
    } 
    return value; 
} 
+0

Можете ли вы показать более подробную информацию о вашем 'StringFormatConverter'. –

+0

@ NicoZhu-MSFT Я отредактировал сообщение, чтобы включить код 'StringFormatConverter'. –

+0

Когда вы удаляете или удаляете TextBox, метод 'ConvertBack' будет выполняться для привязки' TwoWay'. Насколько я вижу, он «бросает новое NotImplementedException»? –

ответ

1

Я проверил ваш код и не нашел ничего плохого. Я не могу воспроизвести вашу проблему. Поскольку ваш код не является целым, я заполняю ваш код и создаю демоверсию, которая может успешно работать. Не могли бы вы попробовать удалить приложение на своем компьютере, очистить решение и переустановить его? Если это не сработает. Попробуйте мой demo и сравните с вашим проектом, если с ним что-то другое.

public class DateToStringConverter : IValueConverter 
{ 
    #region IValueConverter Members 
    public string Format { get; set; } 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 

     var format = (parameter as string) ?? Format; 
     if (format == null) 
      return value; 

     if (string.IsNullOrWhiteSpace(language)) 
     { 
      return string.Format(format, value); 
     } 

     try 
     { 
      var culture = new CultureInfo(language); 
      return string.Format(culture, format, value); 
     } 
     catch 
     { 
      return string.Format(format, value); 
     } 
    } 
    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     if (value is string) 
     { 
      decimal returnDecimal; 
      if (decimal.TryParse(value as string, out returnDecimal)) 
      { 
       return returnDecimal; 
      } 
     } 
     return value; 
    } 
    #endregion 
} 
+0

Такое же поведение с вашим приложением. Если I из «TextBox», он будет отформатировать номер, но если я нажму на другой «TextBox», форматирование не будет применено. –

+0

Я попытался следовать вашему описанию (* кликнуть на другой текстовый блок *), но не воспроизвел вашу проблему. Вы пытались запустить приложение на других компьютерах? –

+0

Я заметил, что он работает в некоторых контекстах. Мне просто нужно посмотреть, в чем проблема, возможно, что-то происходит с базовым объектом, с которым я связываюсь. Спасибо за помощь! –

0

Оказывается, проблема в моем случае было то, что мой View не знал, что это DataContext, потому что он не был привязан к ViewModel. В одном из моих View s я добавил DependencyProperty, чтобы иметь возможность передавать те же ViewModel нескольким дочерним View s, которые являются взаимозаменяемыми. Вот DependencyProperty, что я должен добавить, чтобы заставить его работать правильно:

public sealed partial class PaymentView : UserControl 
{ 
    public InvoiceDetailsPageViewModel ViewModel 
    { 
     get { return (InvoiceDetailsPageViewModel)GetValue(ViewModelProperty); } 
     set { SetValue(ViewModelProperty, value); } 
    } 
    public static readonly DependencyProperty ViewModelProperty = DependencyProperty.Register(
     "ViewModel", typeof(InvoiceDetailsPageViewModel), typeof(PaymentView), null); 

    public PaymentView() 
    { 
     this.InitializeComponent(); 
     this.DataContextChanged += (s, e) => this.Bindings.Update(); 
    } 
} 

Мои InvoiceDetailsPage имеет два различных Views: а PaymentView и InvoiceView. Мне нужно было добавить DependencyProperty ребенку Views (UserControl s в этом случае). Теперь я могу использовать x:Bind, а мой StringFormatConverter работает правильно.

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