我正在使用IValueConverter将double转换为字符串。转换器创建的字符串不会显示在相应的文本框中。例如,如果用户输入1.1,我的值转换器可能会将其格式化为“1”。但是我仍然在文本框中看到“1.1”。我在调试器中验证了转换器的Convert()方法被调用并返回'1'。我错过了一些基本的东西吗?
转换器的方法如下:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
{
return string.Empty;
}
if (value is double && targetType == typeof(string))
{
string format = parameter == null ? "{0:F2}" : (string)parameter;
string formatted = string.Format(format, value);
return formatted;
}
return value.ToString();
}
xaml如下:
<TextBox x:Name="balance" Grid.Row="12" Grid.Column="1"
Text="{Binding Balance, Converter={StaticResource nullableConverter}, ConverterParameter=\{0:F0 \}, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}" Width="90" TextAlignment="Right" />
感谢。
答案 0 :(得分:1)
我认为在TextBox.Text
UpdateSourceTrigger=PropertyChanged
使用转换器是一个已知问题
这通常不是理想的解决方案,因为当用户键入时,值会被转换,因此这可能会导致用户产生混淆和意外结果。
例如,如果用户键入“1.1”,并且在每次按键后值继续被截断为“1”,则事件序列将为:
1
11
作为一种解决方法,我通常建议仅在TextBox没有使用Trigger进行焦点时应用格式,如下所示:
<Style TargetType="{x:Type TextBox}">
<Setter Property="Text" Value="{Binding Balance, Converter={StaticResource nullableConverter}, ConverterParameter=\{0:F0 \}" />
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="Text" Value="{Binding Balance, ValidatesOnDataErrors=True, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}" />
</Trigger>
</Style.Triggers>
</Style>
答案 1 :(得分:0)
您的格式项(花括号内的内容)格式不正确。
而不是
ConverterParameter=\{0:F0 \}
尝试
ConverterParameter='{}{0:F0} '
但是,我想知道设置Binding.StringFormat
属性是不够的?将为您(前后)处理转换,您也将进行验证(至少在用户输入非数字文本的情况下)。
答案 2 :(得分:0)
双向绑定,使其向两个方向流动。
答案 3 :(得分:0)
当Binding对象识别出ViewModel的“Balance”属性发生了变化时,它才会运行该转换器。
您的ViewModel是否同时具有公共Getter和Setter?
如果是这样,Binding应该调用ViewModel上的属性setter,因为文本框中的数据正在改变。
接下来,您需要向属性值已更改的View(和绑定)发出信号。您的viewmodel是否实现了INotifyPropertyChanged?当调用Balance setter时,您的viewmodel是否会引发PropertyChanged事件(PropertyName为“Balance”)?