【问题标题】:Xamarin Sport App - What does IsDirty do?Xamarin 运动应用程序 - IsDirty 做什么?
【发布时间】:2016-09-08 12:23:16
【问题描述】:

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

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

我还看到它被使用 here,我假设这就是他们最初创建它的原因。

感谢大家的深入了解。

【问题讨论】:

    标签: mvvm xamarin xamarin.forms inotifypropertychanged


    【解决方案1】:

    他们只是将其用作处理修改检测的巧妙方法。考虑“保存更改”功能;在某些事情发生变化之前,您实际上并不想启用“保存”按钮,您可以关闭 IsDirty 属性来测试它。

    从技术上讲,您可以自己处理这个问题,方法是拥有一个基类挂钩 INotifyPropertyChanged.PropertyChanged 并维护自己的脏位(可能在基类中),而不是要求所有类都具有 IsDirty 属性他们可能需要也可能不需要,他们已经把它变成了一个类可以实现的可选特性。例如,查看 GameResult 以获取无法更改的示例,因此无法将其标记为脏。

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

    注意:我刚刚做了一个有趣的观察:虽然SetProperty 扩展方法的实现确实设置了IsDirty 标志,但BaseNotify 类'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 更改的信号,直到您发出原始属性已更改的信号。我只是选择保持原来的逻辑。

    【讨论】:

    • 非常酷。非常感谢您的回答和修复!现在我知道它可以用来做什么,我会尝试尝试一下。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      相关资源
      最近更新 更多