diff --git a/src/Umbraco.Core/Models/Content.cs b/src/Umbraco.Core/Models/Content.cs
index d7a6cfd0a4..41ceaf9b90 100644
--- a/src/Umbraco.Core/Models/Content.cs
+++ b/src/Umbraco.Core/Models/Content.cs
@@ -103,8 +103,11 @@ namespace Umbraco.Core.Models
}
set
{
- _template = value;
- OnPropertyChanged(TemplateSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _template = value;
+ return _template;
+ }, _template, TemplateSelector);
}
}
@@ -142,8 +145,11 @@ namespace Umbraco.Core.Models
get { return _published; }
internal set
{
- _published = value;
- OnPropertyChanged(PublishedSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _published = value;
+ return _published;
+ }, _published, PublishedSelector);
}
}
@@ -159,8 +165,11 @@ namespace Umbraco.Core.Models
get { return _language; }
set
{
- _language = value;
- OnPropertyChanged(LanguageSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _language = value;
+ return _language;
+ }, _language, LanguageSelector);
}
}
@@ -173,8 +182,11 @@ namespace Umbraco.Core.Models
get { return _releaseDate; }
set
{
- _releaseDate = value;
- OnPropertyChanged(ReleaseDateSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _releaseDate = value;
+ return _releaseDate;
+ }, _releaseDate, ReleaseDateSelector);
}
}
@@ -187,8 +199,11 @@ namespace Umbraco.Core.Models
get { return _expireDate; }
set
{
- _expireDate = value;
- OnPropertyChanged(ExpireDateSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _expireDate = value;
+ return _expireDate;
+ }, _expireDate, ExpireDateSelector);
}
}
@@ -201,8 +216,11 @@ namespace Umbraco.Core.Models
get { return _writer; }
set
{
- _writer = value;
- OnPropertyChanged(WriterSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _writer = value;
+ return _writer;
+ }, _writer, WriterSelector);
}
}
@@ -217,8 +235,11 @@ namespace Umbraco.Core.Models
get { return _nodeName; }
set
{
- _nodeName = value;
- OnPropertyChanged(NodeNameSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _nodeName = value;
+ return _nodeName;
+ }, _nodeName, NodeNameSelector);
}
}
diff --git a/src/Umbraco.Core/Models/ContentBase.cs b/src/Umbraco.Core/Models/ContentBase.cs
index 3ddf71308e..4c00831cae 100644
--- a/src/Umbraco.Core/Models/ContentBase.cs
+++ b/src/Umbraco.Core/Models/ContentBase.cs
@@ -120,8 +120,11 @@ namespace Umbraco.Core.Models
get { return _name; }
set
{
- _name = value;
- OnPropertyChanged(NameSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _name = value;
+ return _name;
+ }, _name, NameSelector);
}
}
@@ -134,8 +137,11 @@ namespace Umbraco.Core.Models
get { return _sortOrder; }
set
{
- _sortOrder = value;
- OnPropertyChanged(SortOrderSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _sortOrder = value;
+ return _sortOrder;
+ }, _sortOrder, SortOrderSelector);
}
}
@@ -148,8 +154,11 @@ namespace Umbraco.Core.Models
get { return _level; }
set
{
- _level = value;
- OnPropertyChanged(LevelSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _level = value;
+ return _level;
+ }, _level, LevelSelector);
}
}
@@ -162,8 +171,11 @@ namespace Umbraco.Core.Models
get { return _path; }
set
{
- _path = value;
- OnPropertyChanged(PathSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _path = value;
+ return _path;
+ }, _path, PathSelector);
}
}
@@ -176,8 +188,11 @@ namespace Umbraco.Core.Models
get { return _creatorId; }
set
{
- _creatorId = value;
- OnPropertyChanged(CreatorIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _creatorId = value;
+ return _creatorId;
+ }, _creatorId, CreatorIdSelector);
}
}
@@ -192,8 +207,11 @@ namespace Umbraco.Core.Models
get { return _trashed; }
internal set
{
- _trashed = value;
- OnPropertyChanged(TrashedSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _trashed = value;
+ return _trashed;
+ }, _trashed, TrashedSelector);
}
}
@@ -212,8 +230,11 @@ namespace Umbraco.Core.Models
get { return _contentTypeId; }
protected set
{
- _contentTypeId = value;
- OnPropertyChanged(DefaultContentTypeIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _contentTypeId = value;
+ return _contentTypeId;
+ }, _contentTypeId, DefaultContentTypeIdSelector);
}
}
diff --git a/src/Umbraco.Core/Models/ContentType.cs b/src/Umbraco.Core/Models/ContentType.cs
index f10e939489..581c11ce41 100644
--- a/src/Umbraco.Core/Models/ContentType.cs
+++ b/src/Umbraco.Core/Models/ContentType.cs
@@ -48,8 +48,11 @@ namespace Umbraco.Core.Models
get { return _defaultTemplate; }
set
{
- _defaultTemplate = value;
- OnPropertyChanged(DefaultTemplateSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _defaultTemplate = value;
+ return _defaultTemplate;
+ }, _defaultTemplate, DefaultTemplateSelector);
}
}
@@ -62,8 +65,11 @@ namespace Umbraco.Core.Models
get { return _allowedTemplates; }
set
{
- _allowedTemplates = value;
- OnPropertyChanged(AllowedTemplatesSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _allowedTemplates = value;
+ return _allowedTemplates;
+ }, _allowedTemplates, AllowedTemplatesSelector);
}
}
diff --git a/src/Umbraco.Core/Models/DataTypeDefinition.cs b/src/Umbraco.Core/Models/DataTypeDefinition.cs
index 7d42a7e6b4..f7068a3b6e 100644
--- a/src/Umbraco.Core/Models/DataTypeDefinition.cs
+++ b/src/Umbraco.Core/Models/DataTypeDefinition.cs
@@ -53,8 +53,11 @@ namespace Umbraco.Core.Models
get { return _parentId; }
set
{
- _parentId = value;
- OnPropertyChanged(ParentIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _parentId = value;
+ return _parentId;
+ }, _parentId, ParentIdSelector);
}
}
@@ -67,8 +70,11 @@ namespace Umbraco.Core.Models
get { return _name; }
set
{
- _name = value;
- OnPropertyChanged(NameSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _name = value;
+ return _name;
+ }, _name, NameSelector);
}
}
@@ -81,8 +87,11 @@ namespace Umbraco.Core.Models
get { return _sortOrder; }
set
{
- _sortOrder = value;
- OnPropertyChanged(SortOrderSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _sortOrder = value;
+ return _sortOrder;
+ }, _sortOrder, SortOrderSelector);
}
}
@@ -95,8 +104,11 @@ namespace Umbraco.Core.Models
get { return _level; }
set
{
- _level = value;
- OnPropertyChanged(LevelSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _level = value;
+ return _level;
+ }, _level, LevelSelector);
}
}
@@ -109,8 +121,11 @@ namespace Umbraco.Core.Models
get { return _path; }
set
{
- _path = value;
- OnPropertyChanged(PathSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _path = value;
+ return _path;
+ }, _path, PathSelector);
}
}
@@ -123,8 +138,11 @@ namespace Umbraco.Core.Models
get { return _creatorId; }
set
{
- _creatorId = value;
- OnPropertyChanged(UserIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _creatorId = value;
+ return _creatorId;
+ }, _creatorId, UserIdSelector);
}
}
@@ -137,8 +155,11 @@ namespace Umbraco.Core.Models
get { return _trashed; }
internal set
{
- _trashed = value;
- OnPropertyChanged(TrashedSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _trashed = value;
+ return _trashed;
+ }, _trashed, TrashedSelector);
}
}
@@ -150,9 +171,12 @@ namespace Umbraco.Core.Models
{
get { return _controlId; }
private set
- {
- _controlId = value;
- OnPropertyChanged(ControlIdSelector);
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _controlId = value;
+ return _controlId;
+ }, _controlId, ControlIdSelector);
}
}
@@ -164,9 +188,12 @@ namespace Umbraco.Core.Models
{
get { return _databaseType; }
set
- {
- _databaseType = value;
- OnPropertyChanged(DatabaseTypeSelector);
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _databaseType = value;
+ return _databaseType;
+ }, _databaseType, DatabaseTypeSelector);
}
}
diff --git a/src/Umbraco.Core/Models/DictionaryItem.cs b/src/Umbraco.Core/Models/DictionaryItem.cs
index 77fda51466..db3f47ba13 100644
--- a/src/Umbraco.Core/Models/DictionaryItem.cs
+++ b/src/Umbraco.Core/Models/DictionaryItem.cs
@@ -42,8 +42,11 @@ namespace Umbraco.Core.Models
get { return _parentId; }
set
{
- _parentId = value;
- OnPropertyChanged(ParentIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _parentId = value;
+ return _parentId;
+ }, _parentId, ParentIdSelector);
}
}
@@ -56,8 +59,11 @@ namespace Umbraco.Core.Models
get { return _itemKey; }
set
{
- _itemKey = value;
- OnPropertyChanged(ItemKeySelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _itemKey = value;
+ return _itemKey;
+ }, _itemKey, ItemKeySelector);
}
}
@@ -70,8 +76,11 @@ namespace Umbraco.Core.Models
get { return _translations; }
set
{
- _translations = value;
- OnPropertyChanged(TranslationsSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _translations = value;
+ return _translations;
+ }, _translations, TranslationsSelector);
}
}
diff --git a/src/Umbraco.Core/Models/DictionaryTranslation.cs b/src/Umbraco.Core/Models/DictionaryTranslation.cs
index 532d762cd3..5f8f5ebc25 100644
--- a/src/Umbraco.Core/Models/DictionaryTranslation.cs
+++ b/src/Umbraco.Core/Models/DictionaryTranslation.cs
@@ -41,8 +41,11 @@ namespace Umbraco.Core.Models
get { return _language; }
set
{
- _language = value;
- OnPropertyChanged(LanguageSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _language = value;
+ return _language;
+ }, _language, LanguageSelector);
}
}
@@ -55,8 +58,11 @@ namespace Umbraco.Core.Models
get { return _value; }
set
{
- _value = value;
- OnPropertyChanged(ValueSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _value = value;
+ return _value;
+ }, _value, ValueSelector);
}
}
}
diff --git a/src/Umbraco.Core/Models/EntityBase/Entity.cs b/src/Umbraco.Core/Models/EntityBase/Entity.cs
index 8443576424..3c58b61695 100644
--- a/src/Umbraco.Core/Models/EntityBase/Entity.cs
+++ b/src/Umbraco.Core/Models/EntityBase/Entity.cs
@@ -1,9 +1,5 @@
using System;
-using System.Collections.Generic;
-using System.ComponentModel;
using System.Diagnostics;
-using System.Linq;
-using System.Reflection;
using System.Runtime.Serialization;
namespace Umbraco.Core.Models.EntityBase
@@ -14,7 +10,7 @@ namespace Umbraco.Core.Models.EntityBase
[Serializable]
[DataContract(IsReference = true)]
[DebuggerDisplay("Id: {Id}")]
- public abstract class Entity : IEntity, IRememberBeingDirty, ICanBeDirty
+ public abstract class Entity : TracksChangesEntityBase, IEntity, IRememberBeingDirty, ICanBeDirty
{
private bool _hasIdentity;
private int? _hash;
@@ -68,25 +64,6 @@ namespace Umbraco.Core.Models.EntityBase
[DataMember]
public DateTime UpdateDate { get; set; }
- ///
- /// Property changed event
- ///
- public event PropertyChangedEventHandler PropertyChanged;
-
- ///
- /// Method to call on a property setter.
- ///
- /// The property info.
- protected virtual void OnPropertyChanged(PropertyInfo propertyInfo)
- {
- _propertyChangedInfo[propertyInfo.Name] = true;
-
- if (PropertyChanged != null)
- {
- PropertyChanged(this, new PropertyChangedEventArgs(propertyInfo.Name));
- }
- }
-
internal virtual void ResetIdentity()
{
_hasIdentity = false;
@@ -110,120 +87,6 @@ namespace Umbraco.Core.Models.EntityBase
UpdateDate = DateTime.Now;
}
- ///
- /// Tracks the properties that have changed
- ///
- private readonly IDictionary _propertyChangedInfo = new Dictionary();
-
- ///
- /// Tracks the properties that we're changed before the last commit (or last call to ResetDirtyProperties)
- ///
- private IDictionary _lastPropertyChangedInfo = null;
-
- ///
- /// Indicates whether a specific property on the current entity is dirty.
- ///
- /// Name of the property to check
- /// True if Property is dirty, otherwise False
- public virtual bool IsPropertyDirty(string propertyName)
- {
- return _propertyChangedInfo.Any(x => x.Key == propertyName);
- }
-
- ///
- /// Indicates whether the current entity is dirty.
- ///
- /// True if entity is dirty, otherwise False
- public virtual bool IsDirty()
- {
- return _propertyChangedInfo.Any();
- }
-
- ///
- /// Indicates that the entity had been changed and the changes were committed
- ///
- ///
- public bool WasDirty()
- {
- return _lastPropertyChangedInfo != null && _lastPropertyChangedInfo.Any();
- }
-
- ///
- /// Indicates whether a specific property on the current entity was changed and the changes were committed
- ///
- /// Name of the property to check
- /// True if Property was changed, otherwise False. Returns false if the entity had not been previously changed.
- public virtual bool WasPropertyDirty(string propertyName)
- {
- return WasDirty() && _lastPropertyChangedInfo.Any(x => x.Key == propertyName);
- }
-
- ///
- /// Resets the remembered dirty properties from before the last commit
- ///
- public void ForgetPreviouslyDirtyProperties()
- {
- _lastPropertyChangedInfo.Clear();
- }
-
- ///
- /// Resets dirty properties by clearing the dictionary used to track changes.
- ///
- ///
- /// Please note that resetting the dirty properties could potentially
- /// obstruct the saving of a new or updated entity.
- ///
- public virtual void ResetDirtyProperties()
- {
- ResetDirtyProperties(true);
- }
-
- ///
- /// Resets dirty properties by clearing the dictionary used to track changes.
- ///
- ///
- /// true if we are to remember the last changes made after resetting
- ///
- ///
- /// Please note that resetting the dirty properties could potentially
- /// obstruct the saving of a new or updated entity.
- ///
- internal void ResetDirtyProperties(bool rememberPreviouslyChangedProperties)
- {
- if (rememberPreviouslyChangedProperties)
- {
- //copy the changed properties to the last changed properties
- _lastPropertyChangedInfo = _propertyChangedInfo.ToDictionary(v => v.Key, v => v.Value);
- }
-
- _propertyChangedInfo.Clear();
- }
-
- ///
- /// Used by inheritors to set the value of properties, this will detect if the property value actually changed and if it did
- /// it will ensure that the property has a dirty flag set.
- ///
- ///
- ///
- ///
- /// returns true if the value changed
- ///
- /// This is required because we don't want a property to show up as "dirty" if the value is the same. For example, when we
- /// save a document type, nearly all properties are flagged as dirty just because we've 'reset' them, but they are all set
- /// to the same value, so it's really not dirty.
- ///
- internal bool SetPropertyValueAndDetectChanges(Func setValue, T value, PropertyInfo propertySelector)
- {
- var initVal = value;
- var newVal = setValue(value);
- if (!Equals(initVal, newVal))
- {
- OnPropertyChanged(propertySelector);
- return true;
- }
- return false;
- }
-
///
/// Indicates whether the current entity has an identity, eg. Id.
///
diff --git a/src/Umbraco.Core/Models/EntityBase/TracksChangesEntityBase.cs b/src/Umbraco.Core/Models/EntityBase/TracksChangesEntityBase.cs
new file mode 100644
index 0000000000..74562bc250
--- /dev/null
+++ b/src/Umbraco.Core/Models/EntityBase/TracksChangesEntityBase.cs
@@ -0,0 +1,147 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Reflection;
+
+namespace Umbraco.Core.Models.EntityBase
+{
+ ///
+ /// A base class for use to implement IRememberBeingDirty/ICanBeDirty
+ ///
+ public abstract class TracksChangesEntityBase : IRememberBeingDirty
+ {
+ ///
+ /// Tracks the properties that have changed
+ ///
+ private readonly IDictionary _propertyChangedInfo = new Dictionary();
+
+ ///
+ /// Tracks the properties that we're changed before the last commit (or last call to ResetDirtyProperties)
+ ///
+ private IDictionary _lastPropertyChangedInfo = null;
+
+ ///
+ /// Property changed event
+ ///
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ ///
+ /// Method to call on a property setter.
+ ///
+ /// The property info.
+ protected virtual void OnPropertyChanged(PropertyInfo propertyInfo)
+ {
+ _propertyChangedInfo[propertyInfo.Name] = true;
+
+ if (PropertyChanged != null)
+ {
+ PropertyChanged(this, new PropertyChangedEventArgs(propertyInfo.Name));
+ }
+ }
+
+ ///
+ /// Indicates whether a specific property on the current entity is dirty.
+ ///
+ /// Name of the property to check
+ /// True if Property is dirty, otherwise False
+ public virtual bool IsPropertyDirty(string propertyName)
+ {
+ return _propertyChangedInfo.Any(x => x.Key == propertyName);
+ }
+
+ ///
+ /// Indicates whether the current entity is dirty.
+ ///
+ /// True if entity is dirty, otherwise False
+ public virtual bool IsDirty()
+ {
+ return _propertyChangedInfo.Any();
+ }
+
+ ///
+ /// Indicates that the entity had been changed and the changes were committed
+ ///
+ ///
+ public bool WasDirty()
+ {
+ return _lastPropertyChangedInfo != null && _lastPropertyChangedInfo.Any();
+ }
+
+ ///
+ /// Indicates whether a specific property on the current entity was changed and the changes were committed
+ ///
+ /// Name of the property to check
+ /// True if Property was changed, otherwise False. Returns false if the entity had not been previously changed.
+ public virtual bool WasPropertyDirty(string propertyName)
+ {
+ return WasDirty() && _lastPropertyChangedInfo.Any(x => x.Key == propertyName);
+ }
+
+ ///
+ /// Resets the remembered dirty properties from before the last commit
+ ///
+ public void ForgetPreviouslyDirtyProperties()
+ {
+ _lastPropertyChangedInfo.Clear();
+ }
+
+ ///
+ /// Resets dirty properties by clearing the dictionary used to track changes.
+ ///
+ ///
+ /// Please note that resetting the dirty properties could potentially
+ /// obstruct the saving of a new or updated entity.
+ ///
+ public virtual void ResetDirtyProperties()
+ {
+ ResetDirtyProperties(true);
+ }
+
+ ///
+ /// Resets dirty properties by clearing the dictionary used to track changes.
+ ///
+ ///
+ /// true if we are to remember the last changes made after resetting
+ ///
+ ///
+ /// Please note that resetting the dirty properties could potentially
+ /// obstruct the saving of a new or updated entity.
+ ///
+ internal void ResetDirtyProperties(bool rememberPreviouslyChangedProperties)
+ {
+ if (rememberPreviouslyChangedProperties)
+ {
+ //copy the changed properties to the last changed properties
+ _lastPropertyChangedInfo = _propertyChangedInfo.ToDictionary(v => v.Key, v => v.Value);
+ }
+
+ _propertyChangedInfo.Clear();
+ }
+
+ ///
+ /// Used by inheritors to set the value of properties, this will detect if the property value actually changed and if it did
+ /// it will ensure that the property has a dirty flag set.
+ ///
+ ///
+ ///
+ ///
+ /// returns true if the value changed
+ ///
+ /// This is required because we don't want a property to show up as "dirty" if the value is the same. For example, when we
+ /// save a document type, nearly all properties are flagged as dirty just because we've 'reset' them, but they are all set
+ /// to the same value, so it's really not dirty.
+ ///
+ internal bool SetPropertyValueAndDetectChanges(Func setValue, T value, PropertyInfo propertySelector)
+ {
+ var initVal = value;
+ var newVal = setValue(value);
+ if (!Equals(initVal, newVal))
+ {
+ OnPropertyChanged(propertySelector);
+ return true;
+ }
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/File.cs b/src/Umbraco.Core/Models/File.cs
index 34f844a5b3..7fefddfaed 100644
--- a/src/Umbraco.Core/Models/File.cs
+++ b/src/Umbraco.Core/Models/File.cs
@@ -1,5 +1,6 @@
using System;
using System.IO;
+using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Models.EntityBase;
@@ -12,11 +13,17 @@ namespace Umbraco.Core.Models
[DataContract(IsReference = true)]
public abstract class File : Entity, IFile
{
+ private string _path;
+ private string _content;
+
protected File(string path)
{
- Path = path;
+ _path = path;
}
+ private static readonly PropertyInfo ContentSelector = ExpressionHelper.GetPropertyInfo(x => x.Content);
+ private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path);
+
///
/// Gets or sets the Name of the File including extension
///
@@ -48,13 +55,35 @@ namespace Umbraco.Core.Models
/// Gets or sets the Path to the File from the root of the site
///
[DataMember]
- public virtual string Path { get; set; }
+ public virtual string Path
+ {
+ get { return _path; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _path = value;
+ return _path;
+ }, _path, PathSelector);
+ }
+ }
///
/// Gets or sets the Content of a File
///
[DataMember]
- public virtual string Content { get; set; }
+ public virtual string Content
+ {
+ get { return _content; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _content = value;
+ return _content;
+ }, _content, ContentSelector);
+ }
+ }
///
/// Boolean indicating whether the file could be validated
diff --git a/src/Umbraco.Core/Models/Language.cs b/src/Umbraco.Core/Models/Language.cs
index eec4558a8a..6986fae027 100644
--- a/src/Umbraco.Core/Models/Language.cs
+++ b/src/Umbraco.Core/Models/Language.cs
@@ -34,8 +34,11 @@ namespace Umbraco.Core.Models
get { return _isoCode; }
set
{
- _isoCode = value;
- OnPropertyChanged(IsoCodeSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _isoCode = value;
+ return _isoCode;
+ }, _isoCode, IsoCodeSelector);
}
}
@@ -48,8 +51,11 @@ namespace Umbraco.Core.Models
get { return _cultureName; }
set
{
- _cultureName = value;
- OnPropertyChanged(CultureNameSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _cultureName = value;
+ return _cultureName;
+ }, _cultureName, CultureNameSelector);
}
}
diff --git a/src/Umbraco.Core/Models/Macro.cs b/src/Umbraco.Core/Models/Macro.cs
index 904cb05d66..2fe0a2ab60 100644
--- a/src/Umbraco.Core/Models/Macro.cs
+++ b/src/Umbraco.Core/Models/Macro.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Models.EntityBase;
@@ -12,81 +13,240 @@ namespace Umbraco.Core.Models
[DataContract(IsReference = true)]
internal class Macro : Entity, IMacro
{
+ private string _alias;
+ private string _name;
+ private bool _useInEditor;
+ private int _cacheDuration;
+ private bool _cacheByPage;
+ private bool _cacheByMember;
+ private bool _dontRender;
+ private string _scriptFile;
+ private string _scriptAssembly;
+ private string _python;
+ private string _xslt;
+ private List _properties;
+
+ private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias);
+ private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name);
+ private static readonly PropertyInfo UseInEditorSelector = ExpressionHelper.GetPropertyInfo(x => x.UseInEditor);
+ private static readonly PropertyInfo CacheDurationSelector = ExpressionHelper.GetPropertyInfo(x => x.CacheDuration);
+ private static readonly PropertyInfo CacheByPageSelector = ExpressionHelper.GetPropertyInfo(x => x.CacheByPage);
+ private static readonly PropertyInfo CacheByMemberSelector = ExpressionHelper.GetPropertyInfo(x => x.CacheByMember);
+ private static readonly PropertyInfo DontRenderSelector = ExpressionHelper.GetPropertyInfo(x => x.DontRender);
+ private static readonly PropertyInfo ScriptFileSelector = ExpressionHelper.GetPropertyInfo(x => x.ScriptFile);
+ private static readonly PropertyInfo ScriptAssemblySelector = ExpressionHelper.GetPropertyInfo(x => x.ScriptAssembly);
+ private static readonly PropertyInfo PythonSelector = ExpressionHelper.GetPropertyInfo(x => x.Python);
+ private static readonly PropertyInfo XsltSelector = ExpressionHelper.GetPropertyInfo(x => x.Xslt);
+ private static readonly PropertyInfo PropertiesSelector = ExpressionHelper.GetPropertyInfo>(x => x.Properties);
+
///
/// Gets or sets the alias of the Macro
///
[DataMember]
- public string Alias { get; set; }
+ public string Alias
+ {
+ get { return _alias; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _alias = value;
+ return _alias;
+ }, _alias, AliasSelector);
+ }
+ }
///
/// Gets or sets the name of the Macro
///
[DataMember]
- public string Name { get; set; }
+ public string Name
+ {
+ get { return _name; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _name = value;
+ return _name;
+ }, _name, NameSelector);
+ }
+ }
///
/// Gets or sets a boolean indicating whether the Macro can be used in an Editor
///
[DataMember]
- public bool UseInEditor { get; set; }
+ public bool UseInEditor
+ {
+ get { return _useInEditor; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _useInEditor = value;
+ return _useInEditor;
+ }, _useInEditor, UseInEditorSelector);
+ }
+ }
///
/// Gets or sets the Cache Duration for the Macro
///
[DataMember]
- public int CacheDuration { get; set; }
+ public int CacheDuration
+ {
+ get { return _cacheDuration; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _cacheDuration = value;
+ return _cacheDuration;
+ }, _cacheDuration, CacheDurationSelector);
+ }
+ }
///
/// Gets or sets a boolean indicating whether the Macro should be Cached by Page
///
[DataMember]
- public bool CacheByPage { get; set; }
+ public bool CacheByPage
+ {
+ get { return _cacheByPage; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _cacheByPage = value;
+ return _cacheByPage;
+ }, _cacheByPage, CacheByPageSelector);
+ }
+ }
///
/// Gets or sets a boolean indicating whether the Macro should be Cached Personally
///
[DataMember]
- public bool CacheByMember { get; set; }
+ public bool CacheByMember
+ {
+ get { return _cacheByMember; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _cacheByMember = value;
+ return _cacheByMember;
+ }, _cacheByMember, CacheByMemberSelector);
+ }
+ }
///
/// Gets or sets a boolean indicating whether the Macro should be rendered in an Editor
///
[DataMember]
- public bool DontRender { get; set; }
+ public bool DontRender
+ {
+ get { return _dontRender; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _dontRender = value;
+ return _dontRender;
+ }, _dontRender, DontRenderSelector);
+ }
+ }
///
/// Gets or sets the path to the script file in use
///
/// Optional: Can only be one of three Script, Python or Xslt
[DataMember]
- public string ScriptFile { get; set; }
+ public string ScriptFile
+ {
+ get { return _scriptFile; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _scriptFile = value;
+ return _scriptFile;
+ }, _scriptFile, ScriptFileSelector);
+ }
+ }
///
/// Gets or sets the name of the assembly, which should be used by the Macro
///
/// Will usually only be filled if the ScriptFile is a Usercontrol
[DataMember]
- public string ScriptAssembly { get; set; }
+ public string ScriptAssembly
+ {
+ get { return _scriptAssembly; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _scriptAssembly = value;
+ return _scriptAssembly;
+ }, _scriptAssembly, ScriptAssemblySelector);
+ }
+ }
///
/// Gets or set the path to the Python file in use
///
/// Optional: Can only be one of three Script, Python or Xslt
[DataMember]
- public string Python { get; set; }
+ public string Python
+ {
+ get { return _python; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _python = value;
+ return _python;
+ }, _python, PythonSelector);
+ }
+ }
///
/// Gets or sets the path to the Xslt file in use
///
/// Optional: Can only be one of three Script, Python or Xslt
[DataMember]
- public string Xslt { get; set; }
+ public string Xslt
+ {
+ get { return _xslt; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _xslt = value;
+ return _xslt;
+ }, _xslt, XsltSelector);
+ }
+ }
+ //TODO: This needs to be changed to a custom collection class so we can track the dirtyness of each property!
///
/// Gets or sets a list of Macro Properties
///
[DataMember]
- public List Properties { get; set; }
+ public List Properties
+ {
+ get { return _properties; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _properties = value;
+ return _properties;
+ }, _properties, PropertiesSelector);
+ }
+ }
///
/// Overridden this method in order to set a random Id
diff --git a/src/Umbraco.Core/Models/MacroProperty.cs b/src/Umbraco.Core/Models/MacroProperty.cs
index f86f1c4aa1..4202acce1e 100644
--- a/src/Umbraco.Core/Models/MacroProperty.cs
+++ b/src/Umbraco.Core/Models/MacroProperty.cs
@@ -1,5 +1,7 @@
using System;
+using System.Reflection;
using System.Runtime.Serialization;
+using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Models
{
@@ -8,25 +10,68 @@ namespace Umbraco.Core.Models
///
[Serializable]
[DataContract(IsReference = true)]
- internal class MacroProperty : IMacroProperty
+ internal class MacroProperty : TracksChangesEntityBase, IMacroProperty, IRememberBeingDirty
{
+ private string _alias;
+ private string _name;
+ private int _sortOrder;
+ private IMacroPropertyType _propertyType;
+
+ private static readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias);
+ private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name);
+ private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder);
+ private static readonly PropertyInfo PropertyTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.PropertyType);
+
///
/// Gets or sets the Alias of the Property
///
[DataMember]
- public string Alias { get; set; }
+ public string Alias
+ {
+ get { return _alias; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _alias = value;
+ return _alias;
+ }, _alias, AliasSelector);
+ }
+ }
///
/// Gets or sets the Name of the Property
///
[DataMember]
- public string Name { get; set; }
+ public string Name
+ {
+ get { return _name; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _name = value;
+ return _name;
+ }, _name, NameSelector);
+ }
+ }
///
/// Gets or sets the Sort Order of the Property
///
[DataMember]
- public int SortOrder { get; set; }
+ public int SortOrder
+ {
+ get { return _sortOrder; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _sortOrder = value;
+ return _sortOrder;
+ }, _sortOrder, SortOrderSelector);
+ }
+ }
///
/// Gets or sets the Type for this Property
@@ -36,6 +81,18 @@ namespace Umbraco.Core.Models
/// All types was previously contained in the database, but has been ported to code.
///
[DataMember]
- public IMacroPropertyType PropertyType { get; set; }
+ public IMacroPropertyType PropertyType
+
+ {
+ get { return _propertyType; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _propertyType = value;
+ return _propertyType;
+ }, _propertyType, PropertyTypeSelector);
+ }
+ }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Property.cs b/src/Umbraco.Core/Models/Property.cs
index 7ac301f807..d6298d9da2 100644
--- a/src/Umbraco.Core/Models/Property.cs
+++ b/src/Umbraco.Core/Models/Property.cs
@@ -83,8 +83,11 @@ namespace Umbraco.Core.Models
get { return _version; }
set
{
- _version = value;
- OnPropertyChanged(VersionSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _version = value;
+ return _version;
+ }, _version, VersionSelector);
}
}
@@ -109,8 +112,11 @@ namespace Umbraco.Core.Models
"Type validation failed. The value type: '{0}' does not match the DataType in PropertyType with alias: '{1}'",
value == null ? "null" : value.GetType().Name, Alias));
- _value = value;
- OnPropertyChanged(ValueSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _value = value;
+ return _value;
+ }, _value, ValueSelector);
}
}
diff --git a/src/Umbraco.Core/Models/PropertyGroup.cs b/src/Umbraco.Core/Models/PropertyGroup.cs
index 395d0b7992..b17f7246c3 100644
--- a/src/Umbraco.Core/Models/PropertyGroup.cs
+++ b/src/Umbraco.Core/Models/PropertyGroup.cs
@@ -46,8 +46,11 @@ namespace Umbraco.Core.Models
get { return _name; }
set
{
- _name = value;
- OnPropertyChanged(NameSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _name = value;
+ return _name;
+ }, _name, NameSelector);
}
}
@@ -64,8 +67,11 @@ namespace Umbraco.Core.Models
get { return _parentId; }
set
{
- _parentId = value;
- OnPropertyChanged(ParentIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _parentId = value;
+ return _parentId;
+ }, _parentId, ParentIdSelector);
}
}
@@ -78,8 +84,11 @@ namespace Umbraco.Core.Models
get { return _sortOrder; }
set
{
- _sortOrder = value;
- OnPropertyChanged(SortOrderSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _sortOrder = value;
+ return _sortOrder;
+ }, _sortOrder, SortOrderSelector);
}
}
diff --git a/src/Umbraco.Core/Models/PropertyType.cs b/src/Umbraco.Core/Models/PropertyType.cs
index b670693519..2db3d4bd1c 100644
--- a/src/Umbraco.Core/Models/PropertyType.cs
+++ b/src/Umbraco.Core/Models/PropertyType.cs
@@ -73,8 +73,11 @@ namespace Umbraco.Core.Models
get { return _name; }
set
{
- _name = value;
- OnPropertyChanged(NameSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _name = value;
+ return _name;
+ }, _name, NameSelector);
}
}
@@ -87,8 +90,11 @@ namespace Umbraco.Core.Models
get { return _alias; }
set
{
- _alias = value;
- OnPropertyChanged(AliasSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _alias = value;
+ return _alias;
+ }, _alias, AliasSelector);
}
}
@@ -101,8 +107,11 @@ namespace Umbraco.Core.Models
get { return _description; }
set
{
- _description = value;
- OnPropertyChanged(DescriptionSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _description = value;
+ return _description;
+ }, _description, DescriptionSelector);
}
}
@@ -116,8 +125,11 @@ namespace Umbraco.Core.Models
get { return _dataTypeDefinitionId; }
set
{
- _dataTypeDefinitionId = value;
- OnPropertyChanged(DataTypeDefinitionIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _dataTypeDefinitionId = value;
+ return _dataTypeDefinitionId;
+ }, _dataTypeDefinitionId, DataTypeDefinitionIdSelector);
}
}
@@ -131,8 +143,11 @@ namespace Umbraco.Core.Models
get { return _dataTypeId; }
internal set
{
- _dataTypeId = value;
- OnPropertyChanged(DataTypeControlIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _dataTypeId = value;
+ return _dataTypeId;
+ }, _dataTypeId, DataTypeControlIdSelector);
}
}
@@ -145,8 +160,11 @@ namespace Umbraco.Core.Models
get { return _dataTypeDatabaseType; }
set
{
- _dataTypeDatabaseType = value;
- OnPropertyChanged(DataTypeDatabaseTypeSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _dataTypeDatabaseType = value;
+ return _dataTypeDatabaseType;
+ }, _dataTypeDatabaseType, DataTypeDatabaseTypeSelector);
}
}
@@ -159,8 +177,11 @@ namespace Umbraco.Core.Models
get { return _propertyGroupId; }
set
{
- _propertyGroupId = value;
- OnPropertyChanged(PropertyGroupIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _propertyGroupId = value;
+ return _propertyGroupId;
+ }, _propertyGroupId, PropertyGroupIdSelector);
}
}
@@ -173,8 +194,11 @@ namespace Umbraco.Core.Models
get { return _mandatory; }
set
{
- _mandatory = value;
- OnPropertyChanged(MandatorySelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _mandatory = value;
+ return _mandatory;
+ }, _mandatory, MandatorySelector);
}
}
@@ -187,8 +211,11 @@ namespace Umbraco.Core.Models
get { return _helpText; }
set
{
- _helpText = value;
- OnPropertyChanged(HelpTextSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _helpText = value;
+ return _helpText;
+ }, _helpText, HelpTextSelector);
}
}
@@ -201,8 +228,11 @@ namespace Umbraco.Core.Models
get { return _sortOrder; }
set
{
- _sortOrder = value;
- OnPropertyChanged(SortOrderSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _sortOrder = value;
+ return _sortOrder;
+ }, _sortOrder, SortOrderSelector);
}
}
@@ -215,8 +245,11 @@ namespace Umbraco.Core.Models
get { return _validationRegExp; }
set
{
- _validationRegExp = value;
- OnPropertyChanged(ValidationRegExpSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _validationRegExp = value;
+ return _validationRegExp;
+ }, _validationRegExp, ValidationRegExpSelector);
}
}
//Note that Validation should eventually come from PropertyEditors like in v5
diff --git a/src/Umbraco.Core/Models/Relation.cs b/src/Umbraco.Core/Models/Relation.cs
index 2dc1bd877e..edcca14d82 100644
--- a/src/Umbraco.Core/Models/Relation.cs
+++ b/src/Umbraco.Core/Models/Relation.cs
@@ -40,8 +40,11 @@ namespace Umbraco.Core.Models
get { return _parentId; }
set
{
- _parentId = value;
- OnPropertyChanged(ParentIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _parentId = value;
+ return _parentId;
+ }, _parentId, ParentIdSelector);
}
}
@@ -54,8 +57,11 @@ namespace Umbraco.Core.Models
get { return _childId; }
set
{
- _childId = value;
- OnPropertyChanged(ChildIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _childId = value;
+ return _childId;
+ }, _childId, ChildIdSelector);
}
}
@@ -68,8 +74,11 @@ namespace Umbraco.Core.Models
get { return _relationType; }
set
{
- _relationType = value;
- OnPropertyChanged(RelationTypeSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _relationType = value;
+ return _relationType;
+ }, _relationType, RelationTypeSelector);
}
}
@@ -82,8 +91,11 @@ namespace Umbraco.Core.Models
get { return _comment; }
set
{
- _comment = value;
- OnPropertyChanged(CommentSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _comment = value;
+ return _comment;
+ }, _comment, CommentSelector);
}
}
diff --git a/src/Umbraco.Core/Models/RelationType.cs b/src/Umbraco.Core/Models/RelationType.cs
index e7f9dcbd76..cf3448c62d 100644
--- a/src/Umbraco.Core/Models/RelationType.cs
+++ b/src/Umbraco.Core/Models/RelationType.cs
@@ -41,8 +41,11 @@ namespace Umbraco.Core.Models
get { return _name; }
set
{
- _name = value;
- OnPropertyChanged(NameSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _name = value;
+ return _name;
+ }, _name, NameSelector);
}
}
@@ -55,8 +58,11 @@ namespace Umbraco.Core.Models
get { return _alias; }
set
{
- _alias = value;
- OnPropertyChanged(AliasSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _alias = value;
+ return _alias;
+ }, _alias, AliasSelector);
}
}
@@ -69,8 +75,11 @@ namespace Umbraco.Core.Models
get { return _isBidrectional; }
set
{
- _isBidrectional = value;
- OnPropertyChanged(IsBidirectionalSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _isBidrectional = value;
+ return _isBidrectional;
+ }, _isBidrectional, IsBidirectionalSelector);
}
}
@@ -84,8 +93,11 @@ namespace Umbraco.Core.Models
get { return _parentObjectType; }
set
{
- _parentObjectType = value;
- OnPropertyChanged(ParentObjectTypeSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _parentObjectType = value;
+ return _parentObjectType;
+ }, _parentObjectType, ParentObjectTypeSelector);
}
}
@@ -99,8 +111,11 @@ namespace Umbraco.Core.Models
get { return _childObjectType; }
set
{
- _childObjectType = value;
- OnPropertyChanged(ChildObjectTypeSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _childObjectType = value;
+ return _childObjectType;
+ }, _childObjectType, ChildObjectTypeSelector);
}
}
}
diff --git a/src/Umbraco.Core/Models/ServerRegistration.cs b/src/Umbraco.Core/Models/ServerRegistration.cs
index 32282b4f79..877e00c25f 100644
--- a/src/Umbraco.Core/Models/ServerRegistration.cs
+++ b/src/Umbraco.Core/Models/ServerRegistration.cs
@@ -1,4 +1,5 @@
using System;
+using System.Reflection;
using Umbraco.Core.Models.EntityBase;
using Umbraco.Core.Persistence.Mappers;
using Umbraco.Core.Sync;
@@ -7,6 +8,14 @@ namespace Umbraco.Core.Models
{
internal class ServerRegistration : Entity, IServerAddress, IAggregateRoot
{
+ private string _serverAddress;
+ private string _computerName;
+ private bool _isActive;
+
+ private static readonly PropertyInfo ServerAddressSelector = ExpressionHelper.GetPropertyInfo(x => x.ServerAddress);
+ private static readonly PropertyInfo ComputerNameSelector = ExpressionHelper.GetPropertyInfo(x => x.ComputerName);
+ private static readonly PropertyInfo IsActiveSelector = ExpressionHelper.GetPropertyInfo(x => x.IsActive);
+
public ServerRegistration()
{
@@ -45,8 +54,43 @@ namespace Umbraco.Core.Models
ComputerName = computerName;
}
- public string ServerAddress { get; set; }
- public string ComputerName { get; set; }
- public bool IsActive { get; set; }
+ public string ServerAddress
+ {
+ get { return _serverAddress; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _serverAddress = value;
+ return _serverAddress;
+ }, _serverAddress, ServerAddressSelector);
+ }
+ }
+
+ public string ComputerName
+ {
+ get { return _computerName; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _computerName = value;
+ return _computerName;
+ }, _computerName, ComputerNameSelector);
+ }
+ }
+
+ public bool IsActive
+ {
+ get { return _isActive; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _isActive = value;
+ return _isActive;
+ }, _isActive, IsActiveSelector);
+ }
+ }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Stylesheet.cs b/src/Umbraco.Core/Models/Stylesheet.cs
index b4a5ad1ff8..2bed225361 100644
--- a/src/Umbraco.Core/Models/Stylesheet.cs
+++ b/src/Umbraco.Core/Models/Stylesheet.cs
@@ -5,7 +5,6 @@ using System.Runtime.Serialization;
using System.Text;
using Umbraco.Core.IO;
using Umbraco.Core.Models.Css;
-using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Models
{
@@ -159,25 +158,4 @@ namespace Umbraco.Core.Models
get { return string.IsNullOrEmpty(Path) == false; }
}
}
-
- ///
- /// Represents a Stylesheet Property
- ///
- ///
- /// Properties are always formatted to have a single selector, so it can be used in the backoffice
- ///
- [Serializable]
- [DataContract(IsReference = true)]
- public class StylesheetProperty : IValueObject
- {
- public StylesheetProperty(string @alias, string value)
- {
- Alias = alias;
- Value = value;
- }
-
- public string Alias { get; set; }
- public string Value { get; set; }
- public bool IsPartOfAtRule { get; set; }
- }
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/StylesheetProperty.cs b/src/Umbraco.Core/Models/StylesheetProperty.cs
new file mode 100644
index 0000000000..6053f75bd6
--- /dev/null
+++ b/src/Umbraco.Core/Models/StylesheetProperty.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Runtime.Serialization;
+using Umbraco.Core.Models.EntityBase;
+
+namespace Umbraco.Core.Models
+{
+ ///
+ /// Represents a Stylesheet Property
+ ///
+ ///
+ /// Properties are always formatted to have a single selector, so it can be used in the backoffice
+ ///
+ [Serializable]
+ [DataContract(IsReference = true)]
+ public class StylesheetProperty : IValueObject
+ {
+ public StylesheetProperty(string @alias, string value)
+ {
+ Alias = alias;
+ Value = value;
+ }
+
+ public string Alias { get; set; }
+ public string Value { get; set; }
+ public bool IsPartOfAtRule { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Task.cs b/src/Umbraco.Core/Models/Task.cs
index 88a86dcb44..86370c00bb 100644
--- a/src/Umbraco.Core/Models/Task.cs
+++ b/src/Umbraco.Core/Models/Task.cs
@@ -40,8 +40,11 @@ namespace Umbraco.Core.Models
get { return _closed; }
set
{
- _closed = value;
- OnPropertyChanged(ClosedSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _closed = value;
+ return _closed;
+ }, _closed, ClosedSelector);
}
}
@@ -54,8 +57,11 @@ namespace Umbraco.Core.Models
get { return _taskType; }
set
{
- _taskType = value;
- OnPropertyChanged(TaskTypeSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _taskType = value;
+ return _taskType;
+ }, _taskType, TaskTypeSelector);
}
}
@@ -68,8 +74,11 @@ namespace Umbraco.Core.Models
get { return _entityId; }
set
{
- _entityId = value;
- OnPropertyChanged(EntityIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _entityId = value;
+ return _entityId;
+ }, _entityId, EntityIdSelector);
}
}
@@ -82,8 +91,11 @@ namespace Umbraco.Core.Models
get { return _ownerUserId; }
set
{
- _ownerUserId = value;
- OnPropertyChanged(OwnerUserIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _ownerUserId = value;
+ return _ownerUserId;
+ }, _ownerUserId, OwnerUserIdSelector);
}
}
@@ -96,8 +108,11 @@ namespace Umbraco.Core.Models
get { return _assigneeUserId; }
set
{
- _assigneeUserId = value;
- OnPropertyChanged(AssigneeUserIdSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _assigneeUserId = value;
+ return _assigneeUserId;
+ }, _assigneeUserId, AssigneeUserIdSelector);
}
}
@@ -110,8 +125,11 @@ namespace Umbraco.Core.Models
get { return _comment; }
set
{
- _comment = value;
- OnPropertyChanged(CommentSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _comment = value;
+ return _comment;
+ }, _comment, CommentSelector);
}
}
}
diff --git a/src/Umbraco.Core/Models/TaskType.cs b/src/Umbraco.Core/Models/TaskType.cs
index 4789683292..3f753f5ad9 100644
--- a/src/Umbraco.Core/Models/TaskType.cs
+++ b/src/Umbraco.Core/Models/TaskType.cs
@@ -30,8 +30,11 @@ namespace Umbraco.Core.Models
get { return _alias; }
set
{
- _alias = value;
- OnPropertyChanged(AliasSelector);
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _alias = value;
+ return _alias;
+ }, _alias, AliasSelector);
}
}
}
diff --git a/src/Umbraco.Core/Models/Template.cs b/src/Umbraco.Core/Models/Template.cs
index 360dc01833..63062eee84 100644
--- a/src/Umbraco.Core/Models/Template.cs
+++ b/src/Umbraco.Core/Models/Template.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Reflection;
using System.Runtime.Serialization;
using Umbraco.Core.Configuration;
using Umbraco.Core.IO;
@@ -15,6 +16,22 @@ namespace Umbraco.Core.Models
{
private readonly string _alias;
private readonly string _name;
+ private int _creatorId;
+ private int _level;
+ private int _sortOrder;
+ private int _parentId;
+ private string _nodePath;
+ private int _masterTemplateId;
+ private string _masterTemplateAlias;
+
+ private static readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId);
+ private static readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level);
+ private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder);
+ private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId);
+ private static readonly PropertyInfo NodePathSelector = ExpressionHelper.GetPropertyInfo(x => x.NodePath);
+ private static readonly PropertyInfo MasterTemplateIdSelector = ExpressionHelper.GetPropertyInfo(x => x.MasterTemplateId);
+ private static readonly PropertyInfo MasterTemplateAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.MasterTemplateAlias);
+
internal Template(string path)
: base(path)
@@ -37,25 +54,102 @@ namespace Umbraco.Core.Models
}
[DataMember]
- internal int CreatorId { get; set; }
+ internal int CreatorId
+ {
+ get { return _creatorId; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _creatorId = value;
+ return _creatorId;
+ }, _creatorId, CreatorIdSelector);
+ }
+ }
[DataMember]
- internal int Level { get; set; }
+ internal int Level
+ {
+ get { return _level; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _level = value;
+ return _level;
+ }, _level, LevelSelector);
+ }
+ }
[DataMember]
- internal int SortOrder { get; set; }
+ internal int SortOrder
+ {
+ get { return _sortOrder; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _sortOrder = value;
+ return _sortOrder;
+ }, _sortOrder, SortOrderSelector);
+ }
+ }
[DataMember]
- internal int ParentId { get; set; }
+ internal int ParentId
+ {
+ get { return _parentId; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _parentId = value;
+ return _parentId;
+ }, _parentId, ParentIdSelector);
+ }
+ }
[DataMember]
- internal string NodePath { get; set; }
+ internal string NodePath
+ {
+ get { return _nodePath; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _nodePath = value;
+ return _nodePath;
+ }, _nodePath, NodePathSelector);
+ }
+ }
[DataMember]
- internal int MasterTemplateId { get; set; }
+ internal int MasterTemplateId
+ {
+ get { return _masterTemplateId; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _masterTemplateId = value;
+ return _masterTemplateId;
+ }, _masterTemplateId, MasterTemplateIdSelector);
+ }
+ }
[DataMember]
- internal string MasterTemplateAlias { get; set; }
+ internal string MasterTemplateAlias
+ {
+ get { return _masterTemplateAlias; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _masterTemplateAlias = value;
+ return _masterTemplateAlias;
+ }, _masterTemplateAlias, MasterTemplateAliasSelector);
+ }
+ }
[DataMember]
public override string Alias
diff --git a/src/Umbraco.Core/Models/UmbracoEntity.cs b/src/Umbraco.Core/Models/UmbracoEntity.cs
index 6e29dda984..ebb4477557 100644
--- a/src/Umbraco.Core/Models/UmbracoEntity.cs
+++ b/src/Umbraco.Core/Models/UmbracoEntity.cs
@@ -1,4 +1,5 @@
using System;
+using System.Reflection;
using Umbraco.Core.Models.EntityBase;
namespace Umbraco.Core.Models
@@ -8,6 +9,28 @@ namespace Umbraco.Core.Models
///
internal class UmbracoEntity : Entity, IUmbracoEntity
{
+ private int _creatorId;
+ private int _level;
+ private string _name;
+ private int _parentId;
+ private string _path;
+ private int _sortOrder;
+ private bool _trashed;
+ private bool _hasChildren;
+ private bool _isPublished;
+ private Guid _nodeObjectTypeId;
+
+ private static readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId);
+ private static readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level);
+ private static readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name);
+ private static readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId);
+ private static readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path);
+ private static readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder);
+ private static readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed);
+ private static readonly PropertyInfo HasChildrenSelector = ExpressionHelper.GetPropertyInfo(x => x.HasChildren);
+ private static readonly PropertyInfo IsPublishedSelector = ExpressionHelper.GetPropertyInfo(x => x.IsPublished);
+ private static readonly PropertyInfo NodeObjectTypeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.NodeObjectTypeId);
+
public UmbracoEntity()
{
}
@@ -17,24 +40,134 @@ namespace Umbraco.Core.Models
Trashed = trashed;
}
- public int CreatorId { get; set; }
+ public int CreatorId
+ {
+ get { return _creatorId; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _creatorId = value;
+ return _creatorId;
+ }, _creatorId, CreatorIdSelector);
+ }
+ }
- public int Level { get; set; }
+ public int Level
+ {
+ get { return _level; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _level = value;
+ return _level;
+ }, _level, LevelSelector);
+ }
+ }
- public string Name { get; set; }
+ public string Name
+ {
+ get { return _name; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _name = value;
+ return _name;
+ }, _name, NameSelector);
+ }
+ }
- public int ParentId { get; set; }
+ public int ParentId
+ {
+ get { return _parentId; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _parentId = value;
+ return _parentId;
+ }, _parentId, ParentIdSelector);
+ }
+ }
- public string Path { get; set; }
+ public string Path
+ {
+ get { return _path; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _path = value;
+ return _path;
+ }, _path, PathSelector);
+ }
+ }
- public int SortOrder { get; set; }
+ public int SortOrder
+ {
+ get { return _sortOrder; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _sortOrder = value;
+ return _sortOrder;
+ }, _sortOrder, SortOrderSelector);
+ }
+ }
- public bool Trashed { get; private set; }
+ public bool Trashed
+ {
+ get { return _trashed; }
+ private set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _trashed = value;
+ return _trashed;
+ }, _trashed, TrashedSelector);
+ }
+ }
- public bool HasChildren { get; set; }
+ public bool HasChildren
+ {
+ get { return _hasChildren; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _hasChildren = value;
+ return _hasChildren;
+ }, _hasChildren, HasChildrenSelector);
+ }
+ }
- public bool IsPublished { get; set; }
+ public bool IsPublished
+ {
+ get { return _isPublished; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _isPublished = value;
+ return _isPublished;
+ }, _isPublished, IsPublishedSelector);
+ }
+ }
- public Guid NodeObjectTypeId { get; set; }
+ public Guid NodeObjectTypeId
+ {
+ get { return _nodeObjectTypeId; }
+ set
+ {
+ SetPropertyValueAndDetectChanges(o =>
+ {
+ _nodeObjectTypeId = value;
+ return _nodeObjectTypeId;
+ }, _nodeObjectTypeId, NodeObjectTypeIdSelector);
+ }
+ }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index d6b8f1c3b1..930c94dc72 100644
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -175,6 +175,7 @@
+
@@ -211,6 +212,7 @@
+