LazyMagic.Client.ViewModels: MVVM architecture library for reactive client applications built on ReactiveUI. Provides base classes for managing items, collections, sessions, and parent-child relationships with CRUD operations, validation, state management, and connectivity awareness.
LazyMagic.Client.ViewModels provides a comprehensive MVVM (Model-View-ViewModel) architecture for building reactive client applications. Built on ReactiveUI, it offers base classes and patterns for managing single items, collections, sessions, and complex parent-child relationships with full CRUD support, validation, and state management.
LzViewModel
ReactiveObject
CompositeDisposable
ILzItemViewModel<TModel> / LzItemViewModel<TDTO, TModel>
LzItemViewModelState
public enum LzItemViewModelState
{
New, // Creating new item
Edit, // Editing existing item
Current, // Viewing current item
Deleted // Item has been deleted
}
LzEditContext<TDTO, TModel>
ILzItemsViewModel<TVM, TDTO, TModel> / LzItemsViewModel<TVM, TDTO, TModel>
INotifyCollectionChanged
for UI bindingILzSessionViewModel / LzSessionViewModel
ILzSessionsViewModel<T> / LzSessionsViewModel<T>
public class UserModel : User
{
// User extends the User DTO with additional properties
}
public class UserViewModel : LzItemViewModel<User, UserModel>
{
public UserViewModel(
ILzParentViewModel parentViewModel,
User user,
bool? isLoaded = null
) : base(user, isLoaded)
{
ParentViewModel = parentViewModel;
}
protected override async Task<(bool, string)> CreateAsync()
{
// Custom create logic
var result = await UserService.CreateAsync(Model);
return (result.Success, result.Message);
}
}
public class UsersViewModel : LzItemsViewModel<UserViewModel, User, UserModel>
{
private readonly IUserService _userService;
public UsersViewModel(IUserService userService)
{
_userService = userService;
}
protected override async Task<List<User>> ReadDataAsync()
{
return await _userService.GetUsersAsync();
}
protected override UserViewModel CreateViewModel(User dto)
{
return new UserViewModel(this, dto);
}
}
// In a Blazor component
@inherits LzComponentBase<UserViewModel>
<EditForm EditContext="@ViewModel.EditContext.EditContext">
<DataAnnotationsValidator />
<ValidationSummary />
<InputText @bind-Value="ViewModel.Model.Name" />
<button @onclick="@(() => ViewModel.UpdateCommand.Execute().Subscribe())">
Save
</button>
</EditForm>
public class AppSessionViewModel : LzSessionViewModel
{
protected override async Task<(bool, string)> InitAsync()
{
// Initialize session services
await AuthService.InitializeAsync();
return (true, "Session initialized");
}
protected override async Task<(bool, string)> LoadAsync()
{
// Load session data
await LoadUserDataAsync();
return (true, "Session loaded");
}
}
public interface ILzParentViewModel
{
void ItemCreated(object item);
void ItemDeleted(object item);
void ItemUpdated(object item);
void ItemUpdateCanceled(object item);
void ItemRead(object item);
}
public interface IConnectivityService
{
bool IsOnline { get; set; }
IObservable<bool> IsOnlineObservable { get; }
}
[Reactive]
for automatic UI updates(bool success, string message)
from async operations