如何回滚到原始值iPropertyChanged? C#

时间:2017-08-02 09:11:27

标签: c#

我的xamarin表单应用程序中有一个datagrid,它有一个可编辑的列。该列中的值来自MySql数据库,用户可以更改该值并存储到db。我使用IPropertyChanged接口允许用户对值进行更改。编辑值时有一个条件。新值必须等于或大于原始值。我的问题是每当我输入一个大于原始值的值时,我都无法再次将值编辑为之前的值。例如,原始值为10.我输入的新值是30.如果我想再次更改该值,这次我将其设置为20,它不允许我,因为现在原始值是30而不是10和20是否小于30.我如何保留原始值并与之进行比较?

public int ActualReading
    {
        get
        {
            return _ActualReading;
        }

        set
        {

            if (value >= _ActualReading)
            {
            _ActualReading = value;
            RaisePropertyChanged("ActualReading");

            }
            else
            {
                UserDialogs.Instance.Alert("Meter readings should not be smaller than previous value.","Error","Ok");
            }

        }
    }

private void RaisePropertyChanged(String Name)
    {
        if (PropertyChanged != null)

            this.PropertyChanged(this, new PropertyChangedEventArgs(Name));
    }

1 个答案:

答案 0 :(得分:1)

您必须存储原始值。我使用以下模式。

假设您有这样的模型

public class Model
{
    public int ActualReading {get; set;}
}

和这样的视图模型(我删除了INotifyPropertyChanged部分以便更好地阅读)

public class ViewModel
{
    private readonly Model MyModel;

    private int _actualReading;
    public int ActualReading
    {
        get { return _actualReading; }
        set { _actualReading = value; }
    }

    public ViewModel(Model model)
    {
        MyModel = model;
        ActualReading = model.ActualReading;
    }

    public Model GetModel()
    {
        MyModel.ActualReading = ActualReading;

        return MyModel;
    }
}

创建ViewModel实例时,使用相应的Model实例对其进行初始化。实施此操作后,您可以通过这种方式轻松添加支票。

private int _actualReading;
public int ActualReading
{
    get { return _actualReading; }
    set
    {
        if (value >= MyModel.ActualReading)
        {
            _actualReading = value;
        }
        else
        {
            UserDialogs.Instance.Alert("Meter readings should not be smaller than previous value.", "Error", "Ok");
        }
    }
}