Xamarin Sport 应用程序 - IsDirty 有什么作用?

Xamarin Sport App - What does IsDirty do?

我正在查看 Xamarin Sport 应用程序代码,并试图了解他们在其中所做的一些很酷的事情。我无法理解 IsDirty 的确切用途。它被定义为 here and implemented here and used in many places, such as here.

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

我也看到有人在使用它 here 我假设这就是他们首先创建它的原因。

感谢大家的洞察力。

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

从技术上讲,您可以通过使用基础 class 挂钩 INotifyPropertyChanged.PropertyChanged and maintaining a dirty bit of your own (possibly in a base class), but rather than require all of their classes to have an IsDirty property that they may or may not need, they've made it an optional feature that a class can implement. For example, take a look at GameResult 来自行处理此问题,例如无法更改的内容,因此无法将其标记为脏内容。

通过这种方法,您可以最大限度地减少实现此功能所需编写的代码量。您派生的 classes 需要做的就是从 BaseNotify 派生,实现 IDirty,并调用 SetPropertyChanged(...) 作为 setter 来设置私有跟踪字段,signal给任何观察者一个 属性 已经改变,并自动设置脏位。

注意:我确实做了一个有趣的观察:虽然 SetProperty 扩展方法的实现确实设置了 IsDirty 标志,但 BaseNotify class' IsDirty 实现不会调用任何东西来冒泡 IsDirtyPropertyChanged 事件,这意味着针对它的绑定不会在它更改时更新。我相信修复方法是使用 属性 名称 "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.
}

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

我认为它相对简单而且你走在正确的轨道上:属性 的目的是有一个简单的方法来知道是否 some 属性 已更改,因此必须保存整个对象。它融入了 属性 更改传播的方式,因此您不必在设置 属性 值时自行设置它。

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