protected override void NotifyLayoutChanged(PropertyChange change) { if (IsActive) { base.NotifyLayoutChanged(change); } }
protected bool SetPropertyValue <T>(ref T property, T value, [CallerMemberName] string propertyName = null) { if (!EqualityComparer <T> .Default.Equals(property, value)) { var propChange = new PropertyChange(this, propertyName, property, value); property = value; NotifyLayoutChanged(propChange); return(true); } return(false); }
protected bool SetFieldValue <T>(ref T[] field, int index, T value, string fieldName) { if (!EqualityComparer <T> .Default.Equals(field[index], value)) { var propChange = new PropertyChange(this, fieldName, index, field[index], value, true); field[index] = value; NotifyLayoutChanged(propChange); return(true); } return(false); }
protected virtual void NotifyLayoutChanged(PropertyChange change) { Layout?.NotifyLayoutChanged(change); }
//TODO: move code into each Change type class and clean-up the structure private void ApplyPropertyChange(PropertyChange propChange, bool setNewValue) { var ownerType = propChange.Component?.GetType() ?? GetType(); var ownerObject = (object)propChange.Component ?? this; var valueToSet = setNewValue ? propChange.NewValue : propChange.OldValue; if (propChange.IsField) { var fi = ownerType.GetField(propChange.Property, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); if (propChange.Index.HasValue) { var arrayValue = (IList)fi.GetValue(ownerObject); arrayValue[propChange.Index.Value] = valueToSet; } else { fi.SetValue(ownerObject, valueToSet); } if (ownerObject is LayoutComponent component) { component.OnSetFieldValue(propChange.Name, fi.GetValue(ownerObject), propChange.Index, valueToSet); } NotifyLayoutChanged(new PropertyChange(propChange.Component, propChange.Property, setNewValue ? propChange.OldValue : propChange.NewValue, setNewValue ? propChange.NewValue : propChange.OldValue, true)); } else { PropertyInfo pi = null; bool isSubProperty = false; if (propChange.Property.Contains(".")) { string[] propNames = propChange.Property.Split('.'); pi = ownerType.GetProperty(propNames[0]); ownerObject = pi.GetValue(ownerObject); ownerType = ownerObject.GetType(); pi = ownerType.GetProperty(propNames[1]); isSubProperty = true; } else { pi = ownerType.GetProperty(propChange.Property); } pi.SetValue(ownerObject, valueToSet); if (isSubProperty) { NotifyLayoutChanged(new PropertyChange(propChange.Component, propChange.Property, propChange.Index, propChange.NewValue, propChange.OldValue, propChange.IsField)); } } }