WPF TextBox绑定与格式

ozc*_*cho 10 wpf binding string-formatting

我刚刚将我们的wpf应用程序从3.5sp1升级到4.0.

我们使用下面的代码将文本框绑定到底层视图模型.文本框是可编辑的.

    <TextBox HorizontalContentAlignment="Right"
Text="{Binding Path=Price,   StringFormat={0:#,##0;(#,##0)},  Mode=TwoWay,  ValidatesOnDataErrors=True,  UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True}"/>
Run Code Online (Sandbox Code Playgroud)

在3.5sp1中,格式化最初只会发生.因此,当文本框被加载并绑定到值4000时,格式化将其更改为4,000.如果用户编辑了此值,则不会进行格式化.

在4.0中,格式化随着值的变化而发生(即当用户输入新值时).虽然从理论上说这听起来不错,实际上它是一场灾难.光标到处都是.它无法使用.

现在,我们可以将UpdateSourceTrigger更改为"LostFocus",但这会在某些情况下引入未验证数据的新问题.

有没有办法恢复旧的3.5sp1行为?

更新1

使用Converter仍然会产生相同的行为:

public class DecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
            return ((decimal)value).ToString("#,##0;(#,##0)");

        return string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}
Run Code Online (Sandbox Code Playgroud)

和修改后的XAML:

<TextBox Text="{Binding Path=Price, Converter={StaticResource DecimalConverter}, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True}"/>
Run Code Online (Sandbox Code Playgroud)

更新2

与此连接文章类似.

ozc*_*cho 2

作为更新,我采纳了 Jonathan 的建议并重新调整了 Binding 以使用 LostFocus 而不是 PropertyChanged(在适当的情况下 - 即还指定了 StringFormat 的地方)。

正如乔纳森所说,在某些情况下,您必须采用这种方法手动触发绑定刷新/验证。

如果有人有更好的方法,我很乐意看到。