我正在尝试实现以下目标:
我有一个表单,用户必须输入名称,姓氏,地址...以及“保存更改”按钮。
我想让用户只有在确实进行了任何更改的情况下,才能单击保存更改按钮。我发现仅使用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/