2017-01-09 23 views
0

Ich habe ein TextBox in meiner XAML definiert als:Update-String-Format von TextBox auf den Fokus verloren

<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}'}" /> 

Der Wandler angelegt wird, wenn ich TAB aus dem TextBox, aber wenn ich weg klicken, die Zeichenfolge wird nicht automatisch formatiert. Ich habe ähnliche Fragen gelesen, habe aber keine Lösung gesehen. Wie ich bereits erwähnt habe, funktioniert es beim Tab-out zwar einwandfrei, aber nicht normal LostFocus.

Ich verwende Vorlage 10 in einem universellen Windows-Projekt. Hier ist die StringFormatConverter von Vorlage 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 Added benutzerdefinierte ConvertBack Methode:

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

Können Sie mehr Details über Ihren 'StringFormatConverter' anzeigen? –

+0

@ NicoZhu-MSFT Ich habe den Beitrag bearbeitet, um den 'StringFormatConverter'-Code einzuschließen. –

+0

Wenn Sie die TextBox TAB-Taste drücken oder wegklicken, wird die 'ConvertBack' Methode für' TwoWay' Binding ausgeführt. Soweit ich es sehen kann, "werfen neue NotImplementedException"? –

Antwort

1

Ich habe Ihren Code überprüft und nichts gefunden falsch. Ich kann dein Problem nicht reproduzieren. Da Ihr Code nicht das ganze ist, vervollständige ich Ihren Code und erstelle eine Demo, die erfolgreich ausgeführt werden kann. Könnten Sie bitte versuchen, die App auf Ihrem Computer zu deinstallieren, die Lösung zu bereinigen und sie erneut bereitzustellen? Wenn es nicht funktioniert. Bitte versuchen Sie meine demo und vergleichen Sie mit Ihrem Projekt, wenn etwas anders ist.

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

Gleiches Verhalten mit Ihrer App. Wenn ich aus der 'TextBox', wird es die Zahl formatieren, aber wenn ich in eine andere' TextBox' klicke, wird die Formatierung nicht angewendet. –

+0

Ich habe versucht, Ihrer Beschreibung zu folgen (* Klicken Sie in eine andere TextBox *), aber reproduzieren Sie Ihr Problem nicht. Haben Sie versucht, Ihre App auf anderen Computern auszuführen? –

+0

Ich habe festgestellt, dass es in einigen Kontexten zu funktionieren scheint. Ich muss nur sehen, was das Problem ist, vielleicht ist etwas mit dem zugrunde liegenden Objekt los, an das ich gebunden bin. Danke für Ihre Hilfe! –

0

Es stellt sich die Frage, in meinem Fall, war, dass meine View nicht DataContext wusste, weil es nicht auf die ViewModel gebunden war. In einer meiner View s hatte ich eine DependencyProperty hinzugefügt, um in der Lage zu sein, dieselbe ViewModel an mehrere Kinder View s zu übergeben, die austauschbar sind. Hier ist die DependencyProperty, die ich hatte hinzufügen, um es richtig zu arbeiten:

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(); 
    } 
} 

Mein InvoiceDetailsPage hat zwei verschiedene Views: a PaymentView und ein InvoiceView. Ich musste die DependencyProperty zu dem Kind hinzufügen Views (UserControl s in diesem Fall). Jetzt kann ich x:Bind verwenden, und meine StringFormatConverter funktioniert ordnungsgemäß.

Verwandte Themen