2016-05-12 27 views
1

我正在查看Xamarin Sport應用程序代碼,並試圖瞭解他們正在做的一些很酷的事情。我不明白什麼IsDirty正在使用。它被定義爲here並實施here並在很多地方使用,如hereXamarin Sport App - IsDirty做什麼?

我讀了一些關於和ICommandIsDirty屬性,所以也許這是一種方式來稱爲整個模型是骯髒的,但有什麼影響呢?

我也看到它正在使用here我認爲這是他們爲什麼首先創建它。

感謝您對我們的洞察力。

回答

1

他們只是用它作爲一種巧妙的方式來處理修改檢測。考慮一個「保存更改」功能;您實際上並不想啓用「保存」按鈕,直到某些內容發生變化,並且您可以鍵入IsDirty屬性來測試該屬性。

從技術上講,你可以通過具有基礎類鉤INotifyPropertyChanged.PropertyChanged和維護自己的髒位(可能在基類)處理這個事情,但不是要求所有的類有一個IsDirty性質,他們可能或者可能不需要,他們已經將其作爲實現的可選功能。例如,請看GameResult以查看不能更改的示例,因此不能將其標記爲髒。

通過這種方法,您可以最大限度地減少實現此功能所需編寫的代碼量。所有派生類需要做的是從BaseNotify派生,實現IDirty,並調用SetPropertyChanged(...)作爲setter來設置專用跟蹤字段,向任何觀察者發送屬性已更改的信號,並自動設置髒位。

注:我也只是做一個有趣的現象:當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. 
} 

或者,你可以推遲信令IsDirty改變,直到後您的信號原有的屬性已更改。我只是選擇保持原來的邏輯。

+0

非常酷。真的很感謝你的答案和修復!我現在試着嘗試一下,知道它可以用於什麼。 – hvaughan3

1

我認爲這是相對簡單的,你在正確的軌道上:該屬性的目的是要有一個簡單的方法來知道某些屬性已被更改,所以整個對象必須保存。它的屬性變化傳播的方式被烘焙,所以無論何時設置屬性值,您都不必自己設置它。 dr:您可以使用它來檢查您的(查看)模型是否值得進行保存操作, - )。

相關問題