IValueConverter不更新wpf TextBox

时间:2013-12-18 18:51:26

标签: wpf mvvm

我正在使用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" />

感谢。

4 个答案:

答案 0 :(得分:1)

我认为在TextBox.Text

UpdateSourceTrigger=PropertyChanged使用转换器是一个已知问题

这通常不是理想的解决方案,因为当用户键入时,值会被转换,因此这可能会导致用户产生混淆和意外结果。

例如,如果用户键入“1.1”,并且在每次按键后值继续被截断为“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”)?