【发布时间】:2011-01-17 12:02:06
【问题描述】:
我最近将一个应用程序从 VS 2008 .NET 3.5 项目转换为 VS2010 .NET 4 项目。项目中的某些 WPF 对话框在转换后的行为会有所不同。我想了解导致这种行为差异的原因,以便找到并修复现在可能存在问题的其他区域。
例如,我有一个 MVVM 对话框,让用户输入一个数字。该数字在内部存储为双精度数,如果用户键入的文本是有效的双精度数,则用户只能接受该对话框。所以我有一个文本框绑定到 ViewModel 中的一个字符串,以及一个仅在字符串为有效双精度时才启用的 OK 按钮。相关的 Xaml 如下所示:
<TextBox Text="{Binding ValueString, UpdateSourceTrigger=PropertyChanged}"/>
<Button IsEnabled="{Binding ValueIsValid}">OK</Button>
ViewModel 看起来像:
class ViewModel : INotifyPropertyChanged
{
private double actualValue;
public string ValueString
{
get { return actualValue.ToString("G3"); }
set
{
double doubleValue;
if (double.TryParse(value, NumberStyles.Float, CultureInfo.CurrentCulture, out doubleValue))
{
actualValue = doubleValue;
ValueIsValid = true;
RaisePropertyChanged("ValueString");
}
else
{
ValueIsValid = false;
}
}
}
private bool valueIsValid = true;
public bool ValueIsValid
{
get { return valueIsValid; }
set
{
if (valueIsValid != value)
{
valueIsValid = value;
RaisePropertyChanged("ValueIsValid");
}
}
}
private void RaisePropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
这在 .NET 3.5 中运行良好,但是当它在 .NET 4 上运行时,当用户输入数字时会出现问题。例如,如果用户在 .NET 3.5 版本的文本框中输入“3.05555”,则一切正常。但是在 .NET 4 版本中,他们可以正常输入 3.05,但是当他们键入下一个“5”时,文本框的值会变为“3.06”,如果再次按 5,则会变为“3.07”。就好像该值在设置后立即从 ValueString 属性中读回(因此被格式化为“G3”),但这在 .NET 3.5 中不会发生。
我查看了What's New in the .NET Framework 4(包括What's New in WPF Version 4),但没有发现任何有关此更改的信息。
如果您想亲眼看看,我创建了一个小示例 VS2010 解决方案,您可以download from here。 BindingTest2008项目是从VS 2008转换而来,面向.NET 3.5,而BindingTest2010项目是在VS 2010中针对.NET 4创建的。两个项目的代码是一样的,但是.NET 4项目有这个问题。
如果能帮助我理解为什么会发生这种情况,我将不胜感激。 谢谢。
更新:删除RaisePropertyChanged("ValueIsValid"); 的调用不会改变行为并且输入无效数字(例如“3.1a”)不会中间被最后一个有效数字替换(例如在这种情况下为“3.1”)。数字也可以输入到比 3 位有效数字更高的精度。例如。 “3.0545555” - 问题似乎只发生在您刚刚输入的内容会导致第三位有效数字舍入时。
【问题讨论】: