質問: WPFについて解決できない問題が発生しましたので、質問させていただきます。 やりたいこと FoodShelfViewModelのFoodsプロパティにオブジェクトが追加された時、Bindingしているターゲットが直後に更新され画面に反映させる。 具体的に言いますと、こちらの画面で右上の食材追加をクリックした時、カレンダーの日付と追加したFoodクラスのLimitDateプロパティのDateが一致する項目に表示させたいと考えています。 理想的な画面 右上のボタンを押した後 ![画像の説明をここに入力](https://i.stack.imgur.com/9RBuh.png) カレンダー上に項目が更新される。 ![画像の説明をここに入力](https://i.stack.imgur.com/B7zCn.png) 現在発生している問題 Calendar.CalendarDayButtonStyleに設定しているDataTemplateでバインドしているコレクションプロパティに新規インスタンスを追加した時、Viewが更新されない 画像で説明すると、 ボタンをクリックした直後の画面が以下のようになってしまいます。 ![画像の説明をここに入力](https://i.stack.imgur.com/Vdx1k.png) コレクションが更新されていることがDataGridで確認はできるのですが、それがカレンダーの日付に一致する項目(今回だと10月17日に追加された画面になってほしい)では更新されていないため、途方に暮れている状態です。 ソースコードを以下に貼っておきます。 どなたかご教授いただけないでしょうか? よろしくお願いします。 2018/10/15追記 現在リビジョンが変わったためこの質問を行った時のリビジョンのtagのurlを記載します。
回答: `ObservableCollection`はコレクション内のプロパティが変わっても`PropertyChanged`イベントが発生しません。 類似質問 何らかの形でViewModelに`PropertyChanged`を告知することで`Binding`ターゲットが更新されます。 手元の環境では`FoodShelfViewModel`のコンストラクタを下記のように書き換えることで動作しました。 ``` public FoodShelfViewModel(FoodShelf model) { this.Model = model; // 変更前(このコードを有効にすると最新の変更が反映されず、1つ前の変更内容が表示される) //this.Foods = this.Model.FoodCollection.ToReadOnlyReactiveCollection(m => m).AddTo(this.Disposable); // FoodCollectionの変更を現行スレッドで即時反映させる this.Foods = this.Model.FoodCollection.ToReadOnlyReactiveCollection(Model.FoodCollection.ToCollectionChanged(), System.Reactive.Concurrency.Scheduler.CurrentThread).AddTo(this.Disposable); // CollectionChanged時にPropertyChangedを強制的に呼び出す Model.FoodCollection.CollectionChangedAsObservable().Subscribe(x => RaisePropertyChanged("Foods")); this.InitProperty(); } ```