我正在尝试实现以下目标:
我有一个表单,用户必须输入名称,姓氏,地址...以及“保存更改”按钮。
我想让用户只有在确实进行了任何更改的情况下,才能单击保存更改按钮。我发现仅使用IChangeTracking即可跟踪用户是否已对该工具进行更改,但应将其还原回去,这不再反射(reflect)出来。因此,每当我看到所做的更改时,我就启动IEqualityComparer;但是没有运气,因为它给了我以下错误:



这是我简单的类Person:

public class Person : ViewModelBase
{
    private string _Name;
    public string Name
    {
        get { return _Name; }
        set
        {
            _Name = value;
            OnPropertyChanged("Name");
        }
    }

    private string _Surname;
    public string Surname
    {
        get { return _Surname; }
        set
        {
            _Surname = value;
            OnPropertyChanged("Surname");
        }
    }
}

这是我的ViewModelBase结构:



最后,这是我设置ViewModel的方法:
public class MainViewModel
{
    public Person osoba { get; set; }
    public Person OldOsoba { get; set; }
    public MainViewModel()
    {
        osoba = new Person();
        osoba.Name = "John";
        osoba.Surname = "Doe";
        osoba.AcceptChanges();

        OldOsoba = new Person();
        OldOsoba.Name = "John";
        OldOsoba.Surname = "Doe";
        OldOsoba.AcceptChanges();

        osoba.ValueChanged += osoba_ValueChanged;
    }

    void osoba_ValueChanged()
    {
        osoba.IsChanged = osoba.Equals(OldOsoba);
    }
}

我乐于接受任何建议,因为我不确定这是否正确。

最佳答案

这是一个替代方案:

在模型中,创建一个 IsDirty 属性,如果“名称”或“姓氏”属性更改,该属性将设置为true:

public class Person : ViewModelBase
{
    public string OldName { get; set; }
    public string OldSurname { get; set; }

    private string _Name;
    public string Name
    {
        get { return _Name; }
        set
        {
            _Name = value;
            OnPropertyChanged("Name");
            OnPropertyChanged("IsDirty");
        }
    }

    private string _Surname;
    public string Surname
    {
        get { return _Surname; }
        set
        {
            _Surname = value;
            OnPropertyChanged("Surname");
            OnPropertyChanged("IsDirty");
        }
    }

    public bool IsDirty
    {
        get
        {
           return this.Name != this.OldName && this.Surname != this.OldSurname;
        }
    }
}

注意:对IsDirty属性甚至基类使用接口(interface)可能是一个好主意。

然后,您可以为ViewModel实现一个命令,该命令将测试列表中的任何人是否已更改:
public class SaveChangesCommand : ICommand
{
    private MainViewModel _viewModel;

    public SaveChangesCommand(MainViewModel viewModel)
    {
        _viewModel = viewModel;
    }

    public bool CanExecute(object parameter)
    {
        //People should be an ObservableCollection<Person> in your view model.
        return _viewModel.People.Any(x => x.IsDirty);
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

    public void Execute(object parameter)
    {
        _viewModel.SaveChanges();
    }
}

在 View 模型中创建此命令的实例:
public SaveChangesCommand SaveChangesCommand { get; set; }

不要忘记实例化它(在您的构造函数中将是一个好地方)

并在您的 View 中绑定(bind)一个按钮:
<Button Command="{Binding SaveChangesCommand}" Content="Save Changes"/>

现在,结合所有这些,当您的任何模型变脏时,“保存更改”按钮将变为启用状态。单击后,它将在 View 模型中调用 SaveChanges 方法。在这里,您将需要实现保存更改的实现,并将所有模型重置为默认状态(IsDirty = false)

我建议您完成MVVM教程here的工作。

关于c# - 具有IChangeTracking的C#mvvm IEqualityComparer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27921844/

10-15 15:38