WPF比较编辑值和原始值的最佳方法

时间:2014-02-17 08:43:01

标签: c# wpf logic

想象一下,我有一个绑定到从数据库中检索的值的文本框。我有一个取消按钮。如下所示:

<TextBox Text="{Binding [someViewModel].TestVar, Mode=TwoWay}"></TextBox>

现在说TestVar的值为10,当用户更新值并按下取消按钮时,我会显示一个弹出窗口,告诉用户your data will be lost. Are you sure you want to proceed?

我的想法是使用TextChangedUpdateSourceTrigger="PropertyChanged"来更新布尔标志,并在取消按钮onclick时进行检查。但问题是,如果用户首先将值从10更新为5,然后再更新为10?然后当用户按下取消按钮时,应该没有警告信息。

我可以知道实现目标的最有效方法是什么?

3 个答案:

答案 0 :(得分:1)

有多种方法可以实现这一目标。

  1. 深入克隆您的viewmodel并验证两个整数值。请参阅How do you do a deep copy an object in .Net

  2. 制作一个包含两个字段的IntegerViewModel

    // the value
    public int Value { get; set; }
    // the temporary backup value on edit.
    public int BackupValue { get; set; }
    

答案 1 :(得分:0)

如果您只想知道更改已执行,而不是确切地将哪个属性值更改为另一个等等。您可以在这样的简单布尔标志中表示此信息:

private bool hasUnsavedChanges;

private string somePropertyValue;
public string SomeProperty
{
    get
    {
        return this.somePropertyValue;
    }

    set
    {
        if(this.somePropertyValue!= value)
        {
            this.hasUnsavedChanges = true;
        }

        this.somePropertyValue= value
    }
}

如果您需要了解有关更改的所有内容,请创建您的传输对象的复制构造函数,并将其存储在某个backupCopy字段中。在验证方法中您只需比较现有对象的所有必需属性及其备份

答案 2 :(得分:0)

在MVVM场景中,在View-model中实现IEditableObject接口,如此解释并在此推荐Answer

IEditableObject是您希望能够回滚更改的好界面。