В моем представлении у меня есть текстовые поля, подобные этому:
<TextBox x:Name="tBoxShippingWeight" Text="{Binding ShippingWeight, Mode=TwoWay}" InputScope="Number" />
Когда пользователь вводит значение, я делаю базовую проверку (не в центре внимания этого вопроса), и если это не удается, я использую систему.Windows.MessageBox, чтобы уведомить пользователя о правильных параметрах и вернуть значение обратно к предыдущему значению, которое всегда допустимо, потому что оно либо пришло из значения инициализации по умолчанию, либо было правильно введено пользователем.В итоге я вызвал RaisePropertyChanged ("ShippingWeight") внутри оператора if, который выполняет проверку.Если я добавлю его в оператор catch, он никогда не будет вызван, если MessageBox также вызывается оттуда.Это разумный способ сделать реверсию или есть что-то лучше?Вот код из ViewModel:
public string ShippingWeight
{
get { return ShippingModel.ShippingWeight.ToString(); }
set
{
if (ShippingModel.ShippingWeight.ToString() == value) return;
var oldValue = ShippingModel.ShippingWeight;
try
{
int intValue = Convert.ToInt32(value);
if (Convert.ToInt32(ShippingParams.ShippingWeightMin) > intValue || Convert.ToInt32(ShippingParams.ShippingWeightMax) < intValue)
{
// Revert back to previous value
// NOTE: This has to be done here. If done in the catch statement,
// it will never run since the MessageBox interferes with it.
RaisePropertyChanged("ShippingWeight");
throw new Exception();
}
ShippingModel.ShippingWeight = intValue;
RaisePropertyChanged("ShippingWeight", oldValue, Convert.ToDouble(value), true);
}
catch (Exception)
{
System.Windows.MessageBox.Show("Value must be a whole number between " + ShippingParams.ShippingWeightMin + " and " + ShippingParams.ShippingWeightMax);
}
}
}