我正在浏览Xamarin Sport应用程序代码并尝试了解他们正在做的一些很酷的事情。我无法理解IsDirty
究竟用于什么。它定义为here并已实施here并在许多地方使用,例如here。
我读了一些关于和ICommand
IsDirty
属性的内容,所以也许这是一种将整个模型称为脏的方法,但这有什么意义?
我也看到它正在使用here,我假设它们是为什么他们首先创建它。
感谢您对所有人的洞察力。
答案 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:你可以用它来检查你的(视图)模型是否值得保存操作, - )。