我最近将一个VS 2008 .NET 3.5项目转换为了一个VS2010 .NET 4项目,其中一些WPF对话框在转换后的项目中表现不同。我想了解是什么原因导致了这种行为差异,以便找到和修复其他可能存在问题的领域。
例如,我有一个MVVM对话框,让用户输入一个数字。该数字在内部存储为double类型,只有当用户输入的文本为有效的double时,才能接受对话框。因此,我有一个绑定到ViewModel中字符串的文本框,以及一个OK按钮,只有在字符串为有效double时才启用。相关的Xaml代码如下:
这在.NET 3.5中运行良好,但当它在.NET 4上运行时,当用户输入数字时就会出现问题。例如,如果用户在.NET 3.5版本的文本框中输入"3.05555",一切正常。然而,在.NET 4版本中,他们可以输入3.05,但当他们输入下一个“5”时,文本框的值就会变为“3.06”,如果再次按下5,则变为“3.07”。就像该值被从
我查看了.NET Framework 4中的新功能(包括WPF Version 4中的新功能),但没有找到关于此更改的任何信息。
如果您想亲自查看,我创建了一个小例子VS2010解决方案,您可以从这里下载。BindingTest2008项目已从VS 2008转换并针对.NET 3.5进行了目标设置,而BindingTest2010项目是在VS 2010中创建的,针对.NET 4进行了目标设置。两个项目的代码相同,但.NET 4项目存在此问题。
我希望能得到任何有关为什么会发生这种情况的帮助。谢谢。
更新:删除对“RaisePropertyChanged(“ValueIsValid”);” 的调用不会改变行为,并且输入无效数字(例如“3.1a”)不会立即被上一个有效数字(例如在那种情况下的“3.1”)替换。还可以输入比3个有效数字更高的精度。例如“3.0545555”-当您刚刚输入的内容会导致第三个有效数字四舍五入时,才会出现问题。
例如,我有一个MVVM对话框,让用户输入一个数字。该数字在内部存储为double类型,只有当用户输入的文本为有效的double时,才能接受对话框。因此,我有一个绑定到ViewModel中字符串的文本框,以及一个OK按钮,只有在字符串为有效double时才启用。相关的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中没有发生过这种情况。我查看了.NET Framework 4中的新功能(包括WPF Version 4中的新功能),但没有找到关于此更改的任何信息。
如果您想亲自查看,我创建了一个小例子VS2010解决方案,您可以从这里下载。BindingTest2008项目已从VS 2008转换并针对.NET 3.5进行了目标设置,而BindingTest2010项目是在VS 2010中创建的,针对.NET 4进行了目标设置。两个项目的代码相同,但.NET 4项目存在此问题。
我希望能得到任何有关为什么会发生这种情况的帮助。谢谢。
更新:删除对“RaisePropertyChanged(“ValueIsValid”);” 的调用不会改变行为,并且输入无效数字(例如“3.1a”)不会立即被上一个有效数字(例如在那种情况下的“3.1”)替换。还可以输入比3个有效数字更高的精度。例如“3.0545555”-当您刚刚输入的内容会导致第三个有效数字四舍五入时,才会出现问题。