Благодаря замечательному ответу Марка Гравелла я смог реализовать отслеживание изменений свойств в своем классе. Однако, когда объект инициализируется впервые и свойства устанавливаются в первый раз, все свойства помечаются как грязные. Как лучше всего обработать первоначальную настройку свойств, чтобы они не помечались как грязные при первой загрузке объекта?
Таким образом, когда свойства 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 используется как свойство на странице aspx, где я храню объект в ViewState
(требование из устаревшего кода). Поэтому я не уверен, как бы я использовал конструктор для 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; }
}
get { if (ViewState[EXTENDED_FIELD_VIEWSTATE_KEY] == null) ViewState[EXTENDED_FIELD_VIEWSTATE_KEY] = new ExtendedFieldDto(); return (ExtendedFieldDto)ViewState[EXTENDED_FIELD_VIEWSTATE_KEY]; }
- person bflemi3   schedule 06.02.2014