49298


WPFについて解決できない問題が発生しましたので、質問させていただきます。

やりたいこと  
FoodShelfViewModelのFoodsプロパティにオブジェクトが追加された時、Bindingしているターゲットが直後に更新され画面に反映させる。

具体的に言いますと、こちらの画面で右上の食材追加をクリックした時、カレンダーの日付と追加したFoodクラスのLimitDateプロパティのDateが一致する項目に表示させたいと考えています。  
理想的な画面

右上のボタンを押した後  
[![画像の説明をここに入力](https://i.stack.imgur.com/9RBuh.png)](https://i.stack.imgur.com/9RBuh.png)

カレンダー上に項目が更新される。  
[![画像の説明をここに入力](https://i.stack.imgur.com/B7zCn.png)](https://i.stack.imgur.com/B7zCn.png)

現在発生している問題  
Calendar.CalendarDayButtonStyleに設定しているDataTemplateでバインドしているコレクションプロパティに新規インスタンスを追加した時、Viewが更新されない

画像で説明すると、  
ボタンをクリックした直後の画面が以下のようになってしまいます。  
[![画像の説明をここに入力](https://i.stack.imgur.com/Vdx1k.png)](https://i.stack.imgur.com/Vdx1k.png)

コレクションが更新されていることがDataGridで確認はできるのですが、それがカレンダーの日付に一致する項目(今回だと10月17日に追加された画面になってほしい)では更新されていないため、途方に暮れている状態です。

ソースコードを以下に貼っておきます。  
<https://github.com/Pregum/Refregator/tree/feature/fix_calendar_items_binding_update>

どなたかご教授いただけないでしょうか？  
よろしくお願いします。

2018/10/15追記  
現在リビジョンが変わったためこの質問を行った時のリビジョンのtagのurlを記載します。  
<https://github.com/Pregum/Refregator/releases/tag/v0.0.1>


CC BY-SA 4.0
2018-10-14T14:49:18.040
49274
2018-10-15T12:06:40.457
2018-10-15T12:06:40.457
30517
30517
question
c# .net wpf
MultiBindingのソースの更新を行ったとき、直後にViewの更新が行われない


`ObservableCollection`はコレクション内のプロパティが変わっても`PropertyChanged`イベントが発生しません。  
[類似質問](https://ja.stackoverflow.com/q/36864)

何らかの形でViewModelに`PropertyChanged`を告知することで`Binding`ターゲットが更新されます。  
手元の環境では`FoodShelfViewModel`のコンストラクタを下記のように書き換えることで動作しました。

[code]

        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();
        }
    
[/code]


CC BY-SA 4.0
2018-10-15T09:44:26.800
49298
2018-10-15T09:44:26.800
9820
49274
answer