私は最近、VS 2008 .NET 3.5プロジェクトからVS2010 .NET 4プロジェクトに変換したアプリケーションを持っています。プロジェクト内の一部のWPFダイアログは、変換後に動作が異なります。私は何がこの行動の違いを引き起こしているのか理解したいので、今問題があるかもしれない他の領域を見つけて修正することができます。.NET 4と.NET 3.5のバインド設定が異なる動作をする理由
たとえば、ユーザーが番号を入力できるMVVMダイアログがあります。数値は内部的にdoubleとして格納され、ユーザーが入力するテキストが有効なdoubleである場合にのみダイアログを受け入れることができます。だから、私は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を含む)を見てきましたが、この変更については何も見つかりませんでした。
これを自分で見たい場合は、download from hereという小さなサンプルのVS2010ソリューションを作成しました。 BindingTest2008プロジェクトはVS 2008から変換され、.NET 3.5をターゲットとし、BindingTest2010プロジェクトは.NET 2010をターゲットとしたVS 2010で作成されました。コードは両方のプロジェクトで同じですが、.NET 4プロジェクトにはこの問題があります。
なぜこのようなことが起こっているのか理解していただければ幸いです。おかげさまで
更新:動作を変更していないコールRaisePropertyChanged("ValueIsValid");
を削除し、無効な番号(例えば「3.1A」)を入力する途中、その場合の最後の有効な番号(例えば「3.1」に置き換えられません。 )。また、数字は3桁の有効数字よりも高い精度で入力することができます。例えば。 "3.0545555" - 入力したばかりのものが第3位の数字を四捨五入すると問題が発生したように見えます。
ここでは、4.5が出ていて、動作が改善されておらず、本当の代替手段もありません。編集行為は、少なくとも言わないと奇妙です。その変化を巻き返す時間、多分? –