感謝Marc Gravell的真棒answer我能夠在我的課程中實現屬性更改跟蹤。但是,首次初始化對象並首次設置屬性時,所有屬性都將被標記爲髒。處理屬性的初始設置的最佳方法是什麼,以便在首次加載對象時不會將其標記爲髒?如何處理具有屬性更改跟蹤的對象的初始化
因此當ExtendedFieldDto
屬性第一次設置時dirtyProperties
總是有一個計數等於繼承類的屬性,在這種情況下ExtendedFieldDto
。
public abstract class NotifyPropertyChanged {
public IDictionary<string, object> dirtyProperties { get; private set; }
protected NotifyPropertyChanged() {
dirtyProperties = new Dictionary<string, object>();
}
protected void setProperty<T>(ref T property, T value, string propertyName) {
if (!EqualityComparer<T>.Default.Equals(property, value)) {
property = value;
if (dirtyProperties.Keys.Contains(propertyName))
dirtyProperties[propertyName] = property;
else
dirtyProperties.Add(propertyName, property);
}
}
}
public class ExtendedFieldDto : NotifyPropertyChanged {
private string _id;
public string id {
get { return _id; }
set { setProperty(ref _id, value, "id"); }
}
private int _idLocation;
public int idLocation {
get { return _idLocation; }
set { setProperty(ref _idLocation, value, "idLocation"); }
}
private string _columnName;
public string columnName {
get { return _columnName; }
set { setProperty(ref _columnName, value, "columnName"); }
}
private string _description;
public string description {
get { return _description; }
set { setProperty(ref _description, value, "description"); }
}
private string _help;
public string help {
get { return _help; }
set { setProperty(ref _help, value, "help"); }
}
}
的DTO當前正被用作其中我存儲在ViewState
對象(從遺留碼的要求)aspx頁上的proprety。所以我不確定如何使用ExtendedFieldDto
的構造函數來設置這種類型的實現的私有屬性。
private ExtendedFieldDto extendedField {
get {
if (ViewState[EXTENDED_FIELD_VIEWSTATE_KEY] == null)
ViewState[EXTENDED_FIELD_VIEWSTATE_KEY] = new ExtendedFieldDto();
return (ExtendedFieldDto)ViewState[EXTENDED_FIELD_VIEWSTATE_KEY];
}
set { ViewState[EXTENDED_FIELD_VIEWSTATE_KEY] = value; }
}
你可以使用一個構造函數來設置你的私人領域?這不應該觸發setProperty。 – Vlad
@Vlad是的,這將會解決工作,但真正的對象有超過20個屬性,它使對象的管理(即:添加/刪除屬性)類型的痛苦。這可能是最好的方法,雖然:/ – bflemi3
@Vlad此外,與我目前的實施,我將這個對象存儲在ViewState中,所以我有一個aspx對象的屬性,在getter上,初始化對象,如果ViewState KeyValue對不存在。所以不知道如何通過所有的屬性。 'get {if(ViewState [EXTENDED_FIELD_VIEWSTATE_KEY] == null)ViewState [EXTENDED_FIELD_VIEWSTATE_KEY] = new ExtendedFieldDto();返回(ExtendedFieldDto)ViewState [EXTENDED_FIELD_VIEWSTATE_KEY]; }' – bflemi3