- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力实现以下目标:
我有一个表单,用户必须输入姓名、姓氏、地址……以及保存更改按钮。
我想让用户点击保存更改 仅当他确实进行了任何更改时才按下按钮。我发现通过简单地使用 IChangeTracking 它只跟踪用户是否完成了 任意 更改工具,但他是否应将更改恢复回来,这不再反射(reflect)。因此,每当我看到已进行更改时,我都会触发 IEqualityComparer;但是没有运气,因为它给了我以下错误:
An unhandled exception of type 'System.StackOverflowException' occurred in Unknown Module.
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");
}
}
}
public abstract class ViewModelBase : INotifyPropertyChanged, IChangeTracking, IEqualityComparer<Person>
{
public event Action ValueChanged;
protected ViewModelBase()
{
this.PropertyChanged = new PropertyChangedEventHandler(OnNotifiedOfPropertyChanged);
ValueChanged += ViewModelBase_ValueChanged;
}
void ViewModelBase_ValueChanged() {/*do nothing*/ }
public bool Equals(Person x, Person y)
{
if (x == null || y == null)
return false;
return (x.Name == y.Name && x.Surname == y.Surname);
}
public int GetHashCode(Person obj)
{
return obj.GetHashCode();
}
private void OnNotifiedOfPropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e != null && !String.Equals(e.PropertyName, "IsChanged", StringComparison.Ordinal))
{
this.IsChanged = true;
}
}
public void AcceptChanges()
{
this.IsChanged = false;
}
public bool IsChanged
{
get
{
lock (_notifyingObjectIsChangedSyncRoot)
{
return _notifyingObjectIsChanged;
}
}
set
{
lock (_notifyingObjectIsChangedSyncRoot)
{
_notifyingObjectIsChanged = value;
this.OnPropertyChanged("IsChanged");
this.ValueChanged.Invoke();
}
}
}
private bool _notifyingObjectIsChanged;
private readonly object _notifyingObjectIsChangedSyncRoot = new Object();
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));//<<<<<Mentioned Error occures here
}
}
}
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);
}
}
最佳答案
这是一个替代方案:
在您的模型中创建 是脏的属性,如果 Name 或 Surname 属性发生更改,该属性将设置为 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;
}
}
}
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();
}
}
public SaveChangesCommand SaveChangesCommand { get; set; }
<Button Command="{Binding SaveChangesCommand}" Content="Save Changes"/>
关于c# mvvm IEqualityComparer with IChangeTracking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27921844/
'Equal' 和 'GetHashcode' 方法存在于对象类中,我们的类型继承了对象基类。 直接实现对象的两种方法和使用 IComparer 接口(interface)有什么区别? 如果我们覆盖对
在 .NET 中,IEnumerable延伸IEnumerable经常派上用场。令人沮丧的是IEqualityComparer和 IComparer不要扩展它们的非通用对应物,尽管 EqualityC
在我的应用程序的一部分中,我有一个选项可以显示当前艺术家不在音乐库中的专辑列表。为此,我调用音乐 API 来获取该艺术家的所有专辑列表,然后删除当前库中的专辑。 为了应对名称的不同大小写以及标题中丢失
假设我像这样实例化了一个字典 var dictionary = new Dictionary(); MyClass 是我自己的类,它实现了一个 IEqualityComparer<> . 现在,当我
我想为 Nullable 结构编写一个相等比较器。比方说,DateTime? .所以我想出了这段代码: public class NullableEntityComparer : IEqualityC
这是我的测试代码(包含没有在应该返回 true 的时候返回 true): HashSet test = new HashSet(new TilePositionCompare()); test.Add
我有一个不可变的值对象 IPathwayModule,其值定义为: (int) block ; (实体)模块,由(字符串)ModuleId 标识; (枚举)状态;和 (实体)类,由(字符串)Class
我有一个 List存储在我的计算机上的文件路径。我的目的是先过滤掉同名的文件,再过滤掉大小相同的文件。 为此,我创建了两个类来实现 IEqualityComparer , 并实现 Equals和 Ge
我只是想从两个列表中删除重复项并将它们合并到一个列表中。我还需要能够定义什么是重复项。我通过 ColumnIndex 属性定义了一个副本,如果它们相同,则它们是重复的。这是我采用的方法: 我找到了一个
我正在尝试设置一个使用字符串列表作为比较属性的 IEqualityComparer。 在下面的 2 行代码中使用 Except 和 Intersect 时,所有记录都被视为"new",没有一个被识别为
给定两个类 class Contract { public int ID {get; set;} // . . . } class DBContract { public in
我想知道是否有可能在 Distinct 中使用单例作为比较器对象?? 假设我有一个元素列表,我需要在该列表上使用不同的函数。通常我会这样做 var result = list.Distinct(ne
首先我看到IEqualityComparer for anonymous type那里的答案没有回答我的问题,很明显我需要一个 IEqualityComparer不和IComparer用于 Linq
我想从列表中获取不同的对象。我尝试实现 IEqualityComparer 但没有成功。请查看我的代码并给我一个关于 IEqualityComparer 的解释。 public class Messa
我的数据库中有一些相同编号的铃铛。我想得到所有这些而不重复。我创建了一个比较类来完成这项工作,但是该函数的执行导致没有 distinct 的函数出现很大的延迟,从 0.6 秒到 3.2 秒! 我做得对
我正在做一些需要自定义比较器的 LINQ,所以我创建了一个实现 IEqualityComparer 的新类.但是,当我使用它时,我每次都必须创建它的一个实例。 Dim oldListOnly = ol
IEqualityComparer 是否公开,其行为与相等 (=) 运算符相同? LanguagePrimitives 模块包含几个:FastGenericEqualityComparer、Gener
我正在努力实现以下目标: 我有一个表单,用户必须输入姓名、姓氏、地址……以及保存更改按钮。 我想让用户点击保存更改 仅当他确实进行了任何更改时才按下按钮。我发现通过简单地使用 IChangeTrack
我有一个自定义对象列表,我试图在其中删除重复记录。我看到很多在线文章都指向 IEqualityComparer(我以前从未使用过它)。 问题是,我应该什么时候使用它?我可以通过 LINQ 在一行代码中
我想要一个 IEqualityComparer当且仅当两个泛型类型相同且忽略泛型参数时返回 true。所以comparer.Equals(typeof(List), typeof(List))应该返回
我是一名优秀的程序员,十分优秀!