0

私の ViewModel には、モデルのリストであるプロパティがあります。

private List<LocationModel> _locations = null;
public List<LocationModel> Locations
{
    get
    {
        return this._locations;
    }
    set
    {
        this._locations = value;
        RaisePropertyChanged("Locations");
    }
}

しかし、このLocationModelクラスは を実装していないINotifyPropertyChangedため、リスト内の項目のプロパティを更新しても UI が更新されません。リスト項目を変更した後、手動でイベントを発生させることでこれを達成しようとしましたが、うまくいきませんでした。このアプローチが機能しない理由を誰かが説明できますか?

前もって感謝します。

4

3 に答える 3

2

INotifyPropertyChangedそのインターフェイスを実装するオブジェクトのインスタンス プロパティでのみ機能します。インターフェイスを実装するプロパティのプロパティではありません。これを機能させたい場合LocationModelは、実装する必要があります。INotifyPropertyChangedLocationModel のソース コードがない場合、または何らかの理由で変更できない場合は、反応させたいすべてのプロパティを を実装するラッパー クラスでラップする必要がありますINotifyPropertyChangedDynamicProxy (dead link) DynamicProxy (cached )を使用して動的にラップできます。

于 2012-06-29T16:56:16.820 に答える
1

RaisePropertyChanged(null) でハックできます。ビューにすべてを更新するように指示しますが、推奨されません。最善の解決策は、INPC を実装するか、それを実装する LocationWrapper を作成することです。極端に行きたい場合は、動的オブジェクトを使用してモデルをプロキシするか、動的プロキシを使用して同じことを行うことができます。

于 2012-06-28T16:30:12.907 に答える
1

List の代わりに ObservableCollection を使用します。ObservableCollection 内のアイテムを変更すると、View への通知がトリガーされます。

private ObservableCollection<LocationModel> _locations = null;
public ObservableCollection<LocationModel> Locations
    {
    get
    {
        return this._locations;
    }
    set
    {
        this._locations = value;
        RaisePropertyChanged("Locations");
    }
}
于 2012-06-28T22:46:57.103 に答える