丢失焦点时更新TextBox的字符串格式

时间:2017-01-09 18:13:15

标签: xaml uwp

我的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

我在通用Windows项目中使用模板10。以下是模板10中的StringFormatConverter

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

编辑添加了自定义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;
}

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

事实证明,我的问题是我的View不知道DataContext,因为它与ViewModel无关。 。在我的一个View中,我添加了一个DependencyProperty,以便能够将相同的ViewModel传递给可互换的多个子View。以下是我必须添加的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有两个不同的ViewsPaymentViewInvoiceView。我需要将DependencyProperty添加到子Views(在这种情况下为UserControl)。现在我可以使用x:Bind,我的StringFormatConverter可以正常使用。