2017-12-04 20 views
1

私は、このクラスのリストにそれらを受け取る、私は、Webサービス から取得した画像のグループを持つビューがあります。私は、投票ボタンを表示するので、私は追加された各画像の下にObservableCollectionでモデルプロパティが変更されたときのUIの更新?

public class ImageModel 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public string imageUrl { get; set; } 
    } 

をこれらのイメージを示しListViewObservableCollection<ImageModel >にバインドされている

public bool UpVoted { get; set; } 

が、私は、対応するアイコンにUpVotedの値を変換するコンバータを介して、投票のアイコンを変更したい:上記のモデルに別のブール値プロパティユーザーが投票アイコンをクリック:a commそして、この方法を実行します。

private void OnVoting(ImageModel image) 
    { 
     Images.Single(x => x.id == image.id).UpVoted = !image.UpVoted; 
    } 

問題は、UIが更新されないということである、と私はビューモデルにモデルを投入し、UpVotedプロパティに必要な変更をした問題を理解していることを確認するために(私が「私はUIにUpVotedをバインドする必要があり、それは最初 Y

+0

ここに問題がありますか?私が見る限りでは、MVVMの仕組みを説明したばかりです。 – LordWilmore

+0

ImageModelsのリストを観測可能にすると、そのリストへのエントリが追加または削除された場合にのみ通知されます。モデルにそのプロパティのいずれかの変更について通知する場合は、モデルをそこで実行するか、またはViewModelを使用する必要があります。私はちょうどあなたがそれを保存したい場合、ViewModelのModelのPropertyを参照することになります。 – Fildor

+0

@Fildorが言ったことを補完するために、少なくともUWPの解決策の1つは、リストで項目を追加するときに購読することです.Optservableイベントハンドラは、ObservableCollectionに項目が変更されたことを通知します。あなたのアイテムがコレクションから削除されたときの逆です。 –

答えて

2

を変更するたびに、それが更新されます

bool upVoted; 
     public bool UpVoted 
     { 
      get { return upVoted; } 
      set 
      { 
       Set(ref upVoted, value); 
      } 
     } 

)MVVM光ライブラリを使用してMと、それが動作するようになりました、 私たちのモデルクラスは、あなたが言っていないあなたは準備ができて

+0

はい、抽象的な言い方をすれば、observableコレクションは要素の1つのプロパティが変更されたときにビューを更新しません。要素はそれ自身でこれを行う必要があります。(またはそのコレクションはその要素のpropertychangedイベントを購読しますが、私はその実装を推奨しません) – Csharpest

+0

INPCにオプトインしましたが、 'MvxNotifyPropertyChanged'がどこにあるのか不思議です。 –

0

を行くためにMvxValueConverter

public class ImageModel : MvxNotifyPropertyChanged 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     private bool upVoted ; 
     public bool UpVoted 
     { 
      get { return upVoted ; } 
      set { upVoted = value; RaisePropertyChanged(() => UpVoted); } 
     } 
    } 

その後、MvxNotifyPropertyChangedから継承する必要が使用しているが、すべてのコントロールは、デフォルトでは双方向の通知をサポートするように設定されていないコンテナの一種。したがって、データが変更されたバックエンドからの通知を受け取るには、

Mode=TwoWay 

を追加する必要があります。または、Mustafaによる前回の回答から、クラスがmvvmライト付きのInotifyPropertyChangedイベントを実装していることを確認する必要があるかもしれないことが示されています。

関連する問題