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
与此连接文章类似.
作为更新,我采纳了 Jonathan 的建议并重新调整了 Binding 以使用 LostFocus 而不是 PropertyChanged(在适当的情况下 - 即还指定了 StringFormat 的地方)。
正如乔纳森所说,在某些情况下,您必须采用这种方法手动触发绑定刷新/验证。
如果有人有更好的方法,我很乐意看到。
| 归档时间: |
|
| 查看次数: |
16393 次 |
| 最近记录: |