private async void Application_StartupAsync(object sender, StartupEventArgs e) { if (!mutex.WaitOne(0, false)) { MessageBox.Show("食材管理アプリは既に起動しています。", "二重起動防止", MessageBoxButton.OK, MessageBoxImage.Exclamation); mutex.Close(); mutex = null; this.Shutdown(); } // food var folder = ApplicationData.Current.LocalFolder; var foodDataPath = System.IO.Path.Combine(folder.Path, "food_data.json"); if (File.Exists(foodDataPath) == false) { StorageFile result = await folder.CreateFileAsync("food_data.json"); } //var folder = System.Windows.Storage.ApplicationData.Current.LocalFolder; // 食材データを読み込む(既定値はfood_composition.json) var ins = FoodShelfModel.GetInstance(); var isLoadSuccess = await ins.LoadAsync(); if (isLoadSuccess == false) { Application.Current.Shutdown(); } // 食品成分表の読み込みを行う(既定値food_composition_japanese.json) string hoge = MVVM_Refregator.Properties.Resources.food_composition_japanese; //Assembly assembly = Assembly.GetExecutingAssembly(); //assembly.GetManifestResourceStream("MVVM_Refregator.App.food_composition_japanese.json"); //AnalysisPageModel.GetInstance().LoadFoodComposition(); AnalysisPageModel.GetInstance().LoadFoodComposition((string x) => x, hoge); if (this.canNotification) { if (ins.FoodCollection.Any(x => x.HasUsed == false && x.LimitDate.Date == DateTime.Today.Date)) { this._notificationManager.Show(this._notificationContent, expirationTime: TimeSpan.FromSeconds(4)); } else if (ins.FoodCollection.Any(x => x.HasUsed == false && x.LimitDate.Date <= DateTime.Today.Date.AddDays(7).Date&& x.LimitDate.Date >= DateTime.Today)) { this._notificationManager.Show(this.oneDayLimitContent, expirationTime: TimeSpan.FromSeconds(4)); } } // Viewの起動 var view = new StartupWindow(); view.ShowDialog(); // Notification消すため Application.Current.Shutdown(); }
//public ReactiveCommand Send_AddFood { get; } /// <summary> /// modelを渡したときのctor /// </summary> public FoodShelfViewModel() { this._foodShelfModel = FoodShelfModel.GetInstance(); // FoodCollectionの変更を現行スレッドで即時反映させる this.Foods = this._foodShelfModel.FoodCollection .ToReadOnlyReactiveCollection(_foodShelfModel.FoodCollection.ToCollectionChanged(), System.Reactive.Concurrency.Scheduler.CurrentThread) .AddTo(this.Disposable); // CollectionChanged時にPropertyChangedを強制的に呼び出す _foodShelfModel.FoodCollection.CollectionChangedAsObservable().Subscribe(x => RaisePropertyChanged(nameof(Foods))); //this.FutureFoods = new ObservableCollection<FoodModel>(this.Foods.Where(x => x.LimitDate.Date >= DateTime.Today.Date && !x.HasUsed)); this.FutureFoods = new ObservableCollection <FoodModel>(this.Foods.Where(x => !x.HasUsed)); }
public StartupViewModel() { this._model = FoodShelfModel.GetInstance(); InitProperty(); }
/// <summary> /// ctor /// </summary> /// <param name="model"></param> public EditPageViewModel() { // FoodShelfModel関係 this._foodShelfModel = FoodShelfModel.GetInstance(); this.Foods = this._foodShelfModel.FoodCollection .ToReadOnlyReactiveCollection(_foodShelfModel.FoodCollection.ToCollectionChanged(), System.Reactive.Concurrency.Scheduler.CurrentThread) .AddTo(this.Disposable); this._foodShelfModel.FoodCollection.CollectionChangedAsObservable().Subscribe(x => { switch (x.Action) { // 食材追加時 case System.Collections.Specialized.NotifyCollectionChangedAction.Add: foreach (FoodModel food in x.NewItems) { food.PropertyChanged += this.Afood_PropertyChanged; } break; // 食材削除時 case System.Collections.Specialized.NotifyCollectionChangedAction.Remove: foreach (FoodModel food in x.OldItems) { food.PropertyChanged -= this.Afood_PropertyChanged; } break; // 食材置き換え時 case System.Collections.Specialized.NotifyCollectionChangedAction.Replace: foreach (FoodModel food in x.OldItems) { food.PropertyChanged -= this.Afood_PropertyChanged; } foreach (FoodModel food in x.NewItems) { food.PropertyChanged += this.Afood_PropertyChanged; } break; // 食材移動時 case System.Collections.Specialized.NotifyCollectionChangedAction.Move: break; // 食材リセット時 case System.Collections.Specialized.NotifyCollectionChangedAction.Reset: foreach (var food in this._foodShelfModel.FoodCollection) { food.PropertyChanged -= this.Afood_PropertyChanged; } break; default: break; } }); foreach (var afood in this._foodShelfModel.FoodCollection) { afood.PropertyChanged += this.Afood_PropertyChanged; } // WorkStepModel関係 this._workStepModel = WorkStepModel.GetInstance(); this.WorkSteps = this._workStepModel.ObserveProperty(x => x.CurrentWorkSteps).ToReactiveProperty().AddTo(this.Disposable); // スタンバイモードでなければスタンバイモードに変更する if (this._workStepModel.CurrentWorkStepsType != WorkType.StandBy) { this._workStepModel.SetStandBy(); } // 選択食材プロパティの購読 //this.SelectedFood.Subscribe((_) => //{ // this.IsSelectedFood.Value = this.SelectedFood?.Value != null; //}); this.IsSelectedFood = this.SelectedFood.Select(x => x != null).ToReactiveProperty().AddTo(this.Disposable); // 現在の作業の種類プロパティの購読 this.CurrentWorkStepsType = this._workStepModel.ObserveProperty(m => m.CurrentWorkStepsType).ToReactiveProperty().AddTo(this.Disposable); this.ButtonVisibility = this.CurrentWorkStepsType.Select(x => x == WorkType.StandBy).ToReactiveProperty().AddTo(this.Disposable); this.WorkLoadVisibility = this.CurrentWorkStepsType.Select(x => x != WorkType.StandBy).ToReactiveProperty().AddTo(this.Disposable); // 最後のステップ判定プロパティの購読 this.IsLastStep = this._workStepModel.ObserveProperty(x => x.IsLastStep).ToReactiveProperty().AddTo(this.Disposable); this.NextContent = this.CurrentWorkStepsType.CombineLatest(this.IsLastStep, (currentWorkStepsType, isLastStep) => { if (isLastStep == false) { return("進む"); } switch (currentWorkStepsType) { case WorkType.Create: return("登録"); case WorkType.Update: return("変更"); case WorkType.Delete: return("削除"); case WorkType.Use: return("使用済"); case WorkType.None: case WorkType.StandBy: default: return("---"); } }).ToReactiveProperty().AddTo(this.Disposable); // 登録コマンドの購読 this.Send_NavigateRegister.Subscribe((x) => { if (x is NavigationService navigation) { this._workStepModel.NavigateAddWork(navigation); } }); // 変更コマンドの購読 this.Send_ModifyFood.Subscribe((x) => { if (x is NavigationService navigation) { if (this.SelectedFood.Value != null) { this._workStepModel.NavigateUpdateWork(this.SelectedFood.Value, navigation); } } }); // 削除コマンドの購読 this.Send_RemoveFood.Subscribe((x) => { if (x is NavigationService navigation) { if (this.SelectedFood.Value != null) { this._workStepModel.NavigateDeleteWork(this.SelectedFood.Value, navigation); } } }); // 使用コマンドの購読 this.Send_SetUsed.Subscribe((x) => { if (x is NavigationService navigation) { if (this.SelectedFood.Value != null) { this._workStepModel.NavigateUseWork(this.SelectedFood.Value, navigation); } } }); // 次へコマンドの購読 this.Send_NextStep.Subscribe(async(navigationService) => { if (navigationService is NavigationService navigation) { await this._workStepModel.NextStepAsync(navigation); } }); // 戻るコマンドの購読 this.Send_PrevStep.Subscribe((namevigationService) => { if (namevigationService is NavigationService navigation) { this._workStepModel.PrevStep(navigation); } }); }