public CharacterPlanViewModel() : base("BackingFile", "SnapshotAsText") { var canSave = this.ObservableForProperty(x => x.IsDirty).Select(y => y.Value); Load = ReactiveCommand.CreateAsyncObservable(_ => LoadImpl()); Save = ReactiveCommand.CreateAsyncObservable(canSave, _ => SaveImpl()); SaveSnapshot = ReactiveCommand.CreateAsyncObservable(_ => SaveSnapshotImpl()); AddArmor = ReactiveCommand.CreateAsyncObservable(_ => AddArmorImpl()); RemoveArmor = ReactiveCommand.CreateAsyncObservable(vm => RemoveArmorImpl((ArmorViewModel)vm)); AddWeapon = ReactiveCommand.CreateAsyncObservable(_ => AddWeaponImpl()); RemoveWeapon = ReactiveCommand.CreateAsyncObservable(vm => RemoveWeaponImpl((WeaponViewModel)vm)); ClassPlan = new ClassPlanViewModel(); Monitor(ClassPlan); LevelPlans = new ReactiveList <LevelPlanViewModel>(); Monitor(LevelPlans); Armor = new ReactiveList <ArmorViewModel>(); Monitor(Armor); Weapons = new ReactiveList <WeaponViewModel>(); Monitor(Weapons); var saveLoad = Observable.Merge(Load, Save); saveLoad.Subscribe(_ => MarkClean()); Dirtied.Select(_ => GetMarkdownString()).ToProperty(this, x => x.SnapshotAsText, out _snapShotAsText); SetFromPlan(new CharacterPlan { ClassPlan = new ClassPlan() }); MarkClean(); }
public void OnDirtied() { Dirtied?.Invoke(this, EventArgs.Empty); }
private void MeterSignatures_FieldChanged(Duration delta) => Dirtied?.Invoke(delta);
private void Melody_FieldChanged(Duration delta) => Dirtied?.Invoke(delta);
private void Staffs_FieldChanged(Duration delta) => Dirtied?.Invoke(delta);