Благодаря замечательному Marc Gravell's 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 в настоящее время используется в качестве proprety на-страницы 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; }
}
Не могли бы вы использовать конструктор, который устанавливает ваши личные поля? Это не должно вызывать setProperty. – Vlad
@ Vlad Да, что бы def работать, но реальный объект имеет более 20 свойств и делает управление объектом (то есть: добавление/удаление свойств) видом боли. Это может быть лучшим способом:/ – bflemi3
@ Vlad Кроме того, с моей текущей реализацией я сохраняю этот объект в ViewState, поэтому у меня есть свойство для объекта в моем aspx, которое на геттере инициализирует объект, если ViewState KeyValue Pair не существует. Поэтому не уверен, как я буду передавать все свойства там. 'get {if (ViewState [EXTENDED_FIELD_VIEWSTATE_KEY] == null) ViewState [EXTENDED_FIELD_VIEWSTATE_KEY] = new ExtendedFieldDto(); return (ExtendedFieldDto) ViewState [EXTENDED_FIELD_VIEWSTATE_KEY]; } ' – bflemi3