带有格式的 WPF 文本框绑定(bind)

标签 wpf binding string-formatting

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

我们使用下面的代码将文本框绑定(bind)到底层 View 模型。文本框是可编辑的。

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

在 3.5sp1 中,格式化只会在最初发生。因此,当文本框被加载并绑定(bind)到值 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;
    }
}

和修改后的 XAML:
<TextBox Text="{Binding Path=Price, Converter={StaticResource DecimalConverter}, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True}"/>

更新 2

与此类似 connect article .

最佳答案

作为更新,我接受了 Jonathans 的建议并重新调整了 Binding 以使用 LostFocus 而不是 PropertyChanged(在适当的情况下 - 即在任何地方也指定了 StringFormat)。

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

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

关于带有格式的 WPF 文本框绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4591172/

相关文章:

WPF 更改文本框的左边距

c# - 无法在 Visual Studio 2019 中将 LocBaml 与 WPF .Net 5.0 项目一起使用

c# - WPF AppDomain UnhandledException 处理程序超时

wpf - 有选择地允许编辑 XamDataGrid 单元格

wpf - 是否可以为 StaticResource 动态创建 ResourceKey? (例如使用绑定(bind))

C++ 库的 C# 绑定(bind)

c# - 绑定(bind)到绑定(bind)元素?

c# - 重新格式化字符串以逗号分隔和格式化

c++ - C++中的命名参数字符串格式

java - 设置 AWT 列表中字符串的格式