我刚刚将我们的 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/