我的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;
}
答案 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
有两个不同的Views
:PaymentView
和InvoiceView
。我需要将DependencyProperty
添加到子Views
(在这种情况下为UserControl
)。现在我可以使用x:Bind
,我的StringFormatConverter
可以正常使用。