Skip to content

Instantly share code, notes, and snippets.

@Ddemon26
Created October 25, 2024 23:57
Show Gist options
  • Save Ddemon26/c932e464fb01e3b788730857ce280882 to your computer and use it in GitHub Desktop.
Save Ddemon26/c932e464fb01e3b788730857ce280882 to your computer and use it in GitHub Desktop.
#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