using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using BS.Shared; using BS.Shared.Core; namespace BeWo.ViewModel { public abstract class AbstractBaseVM : INotifyPropertyChanged { private bool _IsDirty; public virtual bool IsDirty { get { return _IsDirty; } } public Type Type { get { return GetType(); } } public event PropertyChangedEventHandler PropertyChanged; public virtual void SetDirty(bool newDirty) { _IsDirty = newDirty; } protected bool AreDifferent(object pMember, object pNewValue) { //if (pNewValue is string && pNewValue != null) //{ // pNewValue = (pNewValue as string).Trim(); //} if (pNewValue is string && ((string) pNewValue) == string.Empty) { return pMember != null && ((string) pMember) != string.Empty; } return (pMember == null && pNewValue != null) || (pMember != null && !pMember.Equals(pNewValue)); } protected bool AreDifferent(object pMember, object pNewValue) { if(pMember is IEnumerable l1 && pNewValue is IEnumerable l2) { return !Enumerable.SequenceEqual(l1, l2); } return AreDifferent(pMember, pNewValue); } protected bool AreEqual(object x, object y) { NullCompareResult lResult = Utils.NullCompare(x, y); return lResult.BothNotNull ? x.Equals(y) : !lResult.Different; } //public bool HasLoggedOnUserRight(UserRightType type) // { // return BeWoApp.HasLoggedOnUserRight(type); // } public object Itself { get { return this; } } public void FirePropertyChangedItself() { FirePropertyChanged(nameof(Itself)); } protected virtual void FirePropertyChanged(string pPropertyName) { FirePropertyChanged(PropertyChanged, this, pPropertyName); } protected void FirePropertyChanged(PropertyChangedEventHandler handler, string pPropertyName) { FirePropertyChanged(handler, this, pPropertyName); } protected void FirePropertyChanged(object sender, string pPropertyName) { FirePropertyChanged(PropertyChanged, sender, pPropertyName); } protected void FirePropertyChanged(object sender, PropertyChangedEventArgs e) { FirePropertyChanged(PropertyChanged, sender, e); } protected void FirePropertyChanged(PropertyChangedEventHandler handler, object sender, string pPropertyName) { FirePropertyChanged(handler, sender, new PropertyChangedEventArgs(pPropertyName)); } protected void FirePropertyChanged(PropertyChangedEventHandler handler, object sender, PropertyChangedEventArgs e) { _IsDirty = true; handler?.Invoke(sender, e); } protected bool SetProperty(ref T field, T value, string propertyName, Func originalValueProvider = null) { if (EqualityComparer.Default.Equals(field, value)) return false; field = value; FirePropertyChanged(propertyName); return true; } } }