I want to implement an autosave mechanism for my form, which consists of a hierarchy of subforms, each containing further subforms. The goal is to trigger an autosave whenever any property changes at any level within the form. I’ve included a pseudo-code for the class structure, showing how events would propagate from the deepest level up to the top to initiate the save. However, I’m concerned about the potential overhead of handling so many property changes. Is there a more efficient approach or any improvements I could make?
(This is an example code, in my real code i have way more properties and more lists with nested forms).
public partial class SchoolFormViewModel : ObservableObjectBase
{
[ObservableProperty]
private string _name;
public ObservableCollection<TeacherFormViewModel> TeacherFormViewModels { get; set; } = new();
public SchoolFormViewModel()
{
this.PropertyChanged += SchoolFormViewModel_PropertyChanged;
TeacherFormViewModels.CollectionChanged += TeacherFormViewModels_CollectionChanged;
}
[RelayCommand]
public void AddTeacherFormViewModel()
{
var teacherFormViewModelToAdd = new TeacherFormViewModel();
teacherFormViewModelToAdd.PropertyChanged += TeacherFormViewModel_PropertyChanged;
}
[RelayCommand]
public void RemoveTeacherFormViewModel(TeacherFormViewModel teacherFormViewModelToRemove)
{
TeacherFormViewModels.Remove(teacherFormViewModelToRemove)
teacherFormViewModelToRemove.PropertyChanged -= TeacherFormViewModel_PropertyChanged;
teacherFormViewModelToRemove = null;
}
// Raise when individual teacher is changed
private void TeacherFormViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
RaisePropertyChanged();
}
// Raise when the collection of teacher is changed
private void TeacherFormViewModels_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
RaisePropertyChanged();
}
// Raise when this school is changed
private void SchoolFormViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
Debug.WriteLine($"TEST: auto save triggering");
}
}
public partial class TeacherFormViewModel : ObservableObjectBase
{
[ObservableProperty]
private string _name;
[ObservableProperty]
private string _address;
public ObservableCollection<SturentFormViewModel> StudentFormViewModels { get; set; } = new();
public TeacherFormViewModel()
{
this.PropertyChange += TeacherFormViewModel_PropertyChanged;
SturentFormViewModels.CollectionChanged += StudentFormViewModels_CollectionChanged;
}
[RelayCommand]
public void AddStudentFormViewModel()
{
var studentFormViewModelToAdd = new StudentFormViewModel();
studentFormViewModelToAdd.PropertyChanged += StudentFormViewModel_PropertyChanged;
}
[RelayCommand]
public void RemoveStudentFormViewModel(StudentFormViewModel studentFormViewModelToRemove)
{
StudentFormViewModels.Remove(studentFormViewModelToRemove)
studentFormViewModelToRemove.PropertyChanged -= StudentFormViewModel_PropertyChanged;
studentFormViewModelToRemove = null;
}
// Raise when individual student is changed
private void StudentFormViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
RaisePropertyChanged();
}
// Raise when this teacher is changed
private void TeacherFormViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
RaisePropertyChanged();
}
// Raise when the collection of student is changed
private void StudentFormViewModels_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
RaisePropertyChanged();
}
}
public partial class StudentFormViewModel : ObservableObjectBase
{
[ObservableProperty]
private string _name;
[ObservableProperty]
private int _class;
}
public abstract class ObservableObjectBase : CommunityToolkit.Mvvm.ComponentModel.ObservableObject
{
public new event PropertyChangedEventHandler PropertyChanged;
public virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}