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

时间:2016-05-12 15:02:56

标签: mvvm xamarin xamarin.forms inotifypropertychanged

我正在浏览Xamarin Sport应用程序代码并尝试了解他们正在做的一些很酷的事情。我无法理解IsDirty究竟用于什么。它定义为here并已实施here并在许多地方使用,例如here

我读了一些关于和ICommand IsDirty属性的内容,所以也许这是一种将整个模型称为脏的方法,但这有什么意义?

我也看到它正在使用here,我假设它们是为什么他们首先创建它。

感谢您对所有人的洞察力。

2 个答案:

答案 0 :(得分:1)

他们只是将它用作处理修改检测的聪明方法。考虑一下" Save Changes"特征;你实际上并不想启用" Save"按钮,直到某些内容发生变化,您可以关闭IsDirty属性来测试它。

从技术上讲,您可以通过使用基类钩子INotifyPropertyChanged.PropertyChanged并保持自己的脏位(可能在基类中)来自己处理这个问题,而不是要求所有类都有{{它们可能需要或不需要的属性,它们使它成为 类可以实现的可选功能。例如,请查看GameResult以获取无法更改的示例,因此无法将其标记为脏。

通过这种方法,您可以最大限度地减少为实现此功能而需要编写的代码量。您需要做的所有派生类都来自IsDirty,实现BaseNotify,并调用IDirty作为设置者来设置私有跟踪字段,向任何观察者发出属性已更改的信号,并自动设置脏位。

注意:我做了一个有趣的观察:虽然SetPropertyChanged(...)扩展方法的实现确实设置了SetProperty标志,IsDirty类' BaseNotify实施并未调用任何内容来为IsDirty冒出PropertyChanged事件,这意味着对其进行的绑定在更改时无法获得更新。我相信修复将是针对该扩展方法调用IsDirty的属性名称" IsDirty":

PropertyChanged

或者,您可以推迟发送if(dirty != null) { dirty.IsDirty = true; handler.Invoke(sender, new PropertyChangedEventArgs("IsDirty")); // Yes, I'm a bad person for hard-coding the name. } 更改信号,直到您发出原始属性发生变化的信号。我只是选择保留原始逻辑。

答案 1 :(得分:1)

我认为它相对简单并且您处于正确的轨道上:该属性的目的是让您轻松了解某些属性是否已更改,所以必须保存整个对象。它融入了传播属性更改的方式,因此无论何时设置属性值,您都不必自己设置它。

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