Created
October 25, 2024 23:57
-
-
Save Ddemon26/c932e464fb01e3b788730857ce280882 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#nullable enable | |
using System; | |
using System.Collections.Generic; | |
using System.Runtime.CompilerServices; | |
using System.ComponentModel; | |
namespace TCS.Infrastructure { | |
public abstract class ObservableObject : INotifyPropertyChanged, INotifyPropertyChanging { | |
public event PropertyChangingEventHandler? PropertyChanging; | |
public event PropertyChangedEventHandler? PropertyChanged; | |
protected virtual void OnPropertyChanging(PropertyChangingEventArgs e) { | |
if (e == null) | |
throw new ArgumentNullException(nameof(e)); | |
PropertyChanging?.Invoke(this, e); | |
} | |
protected void OnPropertyChanging([CallerMemberName] string? propertyName = null) { | |
OnPropertyChanging(new PropertyChangingEventArgs(propertyName)); | |
} | |
protected virtual void OnPropertyChanged(PropertyChangedEventArgs @event) { | |
if (@event == null) | |
throw new ArgumentNullException(nameof(@event)); | |
PropertyChanged?.Invoke(this, @event); | |
} | |
protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) { | |
OnPropertyChanged(new PropertyChangedEventArgs(propertyName)); | |
} | |
protected bool SetProperty<T>(ref T field, T newValue, [CallerMemberName] string? propertyName = null) { | |
if (EqualityComparer<T>.Default.Equals(field, newValue)) | |
return false; | |
OnPropertyChanging(propertyName); | |
field = newValue; | |
OnPropertyChanged(propertyName); | |
return true; | |
} | |
protected bool SetProperty<T>(ref T field, T newValue, EqualityComparer<T> comparer, [CallerMemberName] string? propertyName = null) { | |
if (comparer == null) | |
throw new ArgumentNullException(nameof(comparer)); | |
if (comparer.Equals(field, newValue)) | |
return false; | |
OnPropertyChanging(propertyName); | |
field = newValue; | |
OnPropertyChanged(propertyName); | |
return true; | |
} | |
protected bool SetProperty<T>(T oldValue, T newValue, Action<T> callback, [CallerMemberName] string? propertyName = null) { | |
if (callback == null) | |
throw new ArgumentNullException(nameof(callback)); | |
if (EqualityComparer<T>.Default.Equals(oldValue, newValue)) | |
return false; | |
OnPropertyChanging(propertyName); | |
callback(newValue); | |
OnPropertyChanged(propertyName); | |
return true; | |
} | |
protected bool SetProperty<T>(T oldValue, T newValue, EqualityComparer<T> comparer, Action<T> callback, [CallerMemberName] string? propertyName = null) { | |
if (callback == null) | |
throw new ArgumentNullException(nameof(callback)); | |
if (comparer == null) | |
throw new ArgumentNullException(nameof(comparer)); | |
if (comparer.Equals(oldValue, newValue)) | |
return false; | |
OnPropertyChanging(propertyName); | |
callback(newValue); | |
OnPropertyChanged(propertyName); | |
return true; | |
} | |
protected bool SetProperty<T, TModel>(T oldValue, T newValue, TModel model, Action<TModel, T> callback, [CallerMemberName] string? propertyName = null) { | |
if (callback == null) | |
throw new ArgumentNullException(nameof(callback)); | |
if (model == null) | |
throw new ArgumentNullException(nameof(model)); | |
if (EqualityComparer<T>.Default.Equals(oldValue, newValue)) | |
return false; | |
OnPropertyChanging(propertyName); | |
callback(model, newValue); | |
OnPropertyChanged(propertyName); | |
return true; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment