所以,我有一个包含文本框和标签的简单视图。
<TextBox x:Name="MyIntTextBox" Text="{Binding MyInt, UpdateSourceTrigger=LostFocus, Mode=TwoWay, StringFormat={}{D2}}"/>
<Label Content="{Binding MyStr2}"/>
在ViewModel
,我有:
private decimal myInt;
public decimal MyInt
{
get { return myInt; }
set
{
if (value == myInt) { return; }
myInt = value;
OnPropertyChange();
OnPropertyChange("MyStr2");
}
}
public string MyStr2
{
get
{
return myInt.ToString("N2", CultureInfo.CreateSpecificCulture("en-IN"));
}
}
简单来说,TextBox
Text
绑定到decimal
值,而Label
应该以{{1}}显示正确格式的值
由于textbox
中LostFocus
为UpdateSourceTrigger
,我按TextBox
以使TAB
和validation
有效。
因此,当我输入binding
值时,一切正常。 decimal
正确显示格式化的数字。
当我输入一些垃圾非十进制值时,Label
TextBox
变为红色,表示验证错误。
但是,当我在那之后放一些有效值时,就像这样......
...然后专注于Border
,bam! TextBox
空白。
TextBox
表示正确的值。我在Label
中设置了断点,我可以看到ViewModel
确实有正确的值,在本例中为600,但MyInt
不会显示它。
我的TextBox
窗口中也出现以下错误:
Output
这有什么简单的解决方法吗?或者这是我做错了什么?
答案 0 :(得分:1)
但是,当我在那之后放一些有效值时,就像这样......
如果您在decimal
中输入TextBox
值,它将再次有效。
但是,解决方法是实现您自己的自定义转换器类,以处理decimal
和string
之间的转换。
试试这个:
namespace WpfApp2
{
class DecimalToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return null;
return System.Convert.ToDecimal(value).ToString(parameter as string);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
decimal d;
if (decimal.TryParse(value.ToString(), out d))
return d;
return value;
}
}
}
<StackPanel xmlns:local="clr-namespace:WpfApp2">
<StackPanel.Resources>
<local:DecimalToStringConverter x:Key="conv" />
</StackPanel.Resources>
<TextBox x:Name="MyIntTextBox" Text="{Binding MyInt, Converter={StaticResource conv}, ConverterParameter=0.00}"/>
<Label Content="{Binding MyStr2}"/>
</StackPanel>
答案 1 :(得分:0)
mm8的解决方案很好,但是以可为空的小数点失败。 这是一个固定的ConvertBack函数:
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (decimal.TryParse(value.ToString(), out var d))
return d;
if (Nullable.GetUnderlyingType(targetType) != null)
return null;
else
return 0m;
}