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.
我读了一些关于 ICommand
的 IsDirty
属性 的文章,所以也许这是一种将整个模型称为脏模型的方法,但这有什么含义?
我也看到有人在使用它 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
实现不会调用任何东西来冒泡 IsDirty
的 PropertyChanged
事件,这意味着针对它的绑定不会在它更改时更新。我相信修复方法是使用 属性 名称 "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:您可以使用它来检查您的(视图)模型是否值得保存操作,-)。
我正在查看 Xamarin Sport 应用程序代码,并试图了解他们在其中所做的一些很酷的事情。我无法理解 IsDirty
的确切用途。它被定义为 here and implemented here and used in many places, such as here.
我读了一些关于 ICommand
的 IsDirty
属性 的文章,所以也许这是一种将整个模型称为脏模型的方法,但这有什么含义?
我也看到有人在使用它 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
实现不会调用任何东西来冒泡 IsDirty
的 PropertyChanged
事件,这意味着针对它的绑定不会在它更改时更新。我相信修复方法是使用 属性 名称 "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:您可以使用它来检查您的(视图)模型是否值得保存操作,-)。