MVVM-Light: это лучший способ проверить и восстановить значение в представлении? - PullRequest
2 голосов
/ 12 февраля 2011

В моем представлении у меня есть текстовые поля, подобные этому:

<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);
    }
}

}

1 Ответ

1 голос
/ 13 февраля 2011

Вы можете рассмотреть возможность реализации IEditableObject

Используйте некоторые закрытые поля для хранения старых значений при вызове BeginEdit и используйте эти значения в случае сбоя проверки или отмены редактирования пользователем.

...