У меня есть приложение, которое я недавно преобразовал из проекта VS 2008 .NET 3.5 в проект VS2010 .NET 4. Некоторые из диалоговых окон WPF в проекте ведут себя по-разному после преобразования. Я хотел бы понять, что вызывает эту разницу в поведении, поэтому я могу найти и исправить другие области, которые могут теперь иметь проблемы.Почему установка привязки ведет себя по-разному в .NET 4 vs .NET 3.5
В качестве примера у меня есть диалог 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 имеет проблему, когда пользователь вводит число. Например, если пользователь вводит «3.05555» в текстовое поле версии .NET 3.5, все в порядке. Однако в версии .NET 4 они могут ввести штраф 3.05, но когда они набирают следующий «5», значение текстового поля изменяется на «3.06», а затем изменяется на «3.07», если они снова нажимают 5. Это как если бы значение возвращалось из свойства 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» - проблема только возникает, когда вещь, которую вы только что набрали, вызовет округление на 3-ей значащей фигуре.
Здесь мы, 4.5, вне, никакого улучшения в поведении, и никакой реальной альтернативы. Редактирование поведения причудливо, если не сказать больше.Может быть, время перевернуть это изменение? –