Mvvm Xamarin运动应用程序-IsDirty做什么?

Mvvm Xamarin运动应用程序-IsDirty做什么?,mvvm,xamarin,xamarin.forms,inotifypropertychanged,Mvvm,Xamarin,Xamarin.forms,Inotifypropertychanged,我正在浏览Xamarin Sport应用程序代码,试图了解他们在其中所做的一些很酷的事情。我无法理解IsDirty的确切用途。它在许多地方得到定义、实现和使用,例如 我读了一些关于andICommand的IsDirty属性的文章,所以也许这是一种将整个模型称为脏模型的方法,但这有什么含义呢 我也看到它被使用,我想这就是为什么他们首先创建了它 感谢大家对它的深入了解。他们只是把它当作处理修改检测的一种聪明方法。考虑“保存更改”功能;在某些内容发生更改之前,您实际上不想启用“保存”按钮,您可以关闭I

我正在浏览Xamarin Sport应用程序代码,试图了解他们在其中所做的一些很酷的事情。我无法理解IsDirty的确切用途。它在许多地方得到定义、实现和使用,例如

我读了一些关于and
ICommand
IsDirty
属性的文章,所以也许这是一种将整个模型称为脏模型的方法,但这有什么含义呢

我也看到它被使用,我想这就是为什么他们首先创建了它


感谢大家对它的深入了解。

他们只是把它当作处理修改检测的一种聪明方法。考虑“保存更改”功能;在某些内容发生更改之前,您实际上不想启用“保存”按钮,您可以关闭IsDirty属性来测试它

从技术上讲,您可以通过拥有一个基类钩子并维护自己的一点脏东西(可能在基类中)来处理这个问题,但是他们并没有要求所有的类都有一个
IsDirty
属性,而这是一个类可以实现的可选特性。例如,看一个无法更改,因此不能标记为脏的东西的示例

通过这种方法,您已经最小化了实现此功能所需编写的代码量。您需要做的所有派生类都是从
BaseNotify
派生,实现
IDirty
,并调用
SetPropertyChanged(…)
作为setter来设置私有跟踪字段,向任何观察者发出属性已更改的信号,并自动设置脏位

注意:我刚才做了一个有趣的观察:虽然
SetProperty
扩展方法的实现设置了
IsDirty
标志,但是
BaseNotify
类的
IsDirty
实现不会调用任何东西来为
IsDirty
冒泡出
PropertyChanged
事件,这意味着当它发生变化时,针对它的绑定不会得到更新。我相信该扩展方法可以用属性名“IsDirty”调用
PropertyChanged


或者,您可以推迟发出
IsDirty
更改的信号,直到您发出原始属性已更改的信号。我只是选择保留原始逻辑。

我认为它相对简单,而且您走的是正确的道路:该属性的目的是有一种简单的方法来知道某些属性是否已更改,因此必须保存整个对象。它与属性更改的传播方式密切相关,因此您不必在设置属性值时自行设置它


tl;dr:您可以用它来检查您的(视图)模型是否值得保存操作,-)。

非常酷。非常感谢您的回答和修复!既然我知道它可以用来做什么,我就要尝试一下。
if(dirty != null) {
    dirty.IsDirty = true;
    handler.Invoke(sender, new PropertyChangedEventArgs("IsDirty"));
    // Yes, I'm a bad person for hard-coding the name.
}