在模型列表上手动调用PropertyChanged

时间:2012-06-28 16:22:59

标签: silverlight mvvm

在我的ViewModel中,我有一个属性,它是一个模型列表:

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

但是LocationModel类没有实现INotifyPropertyChanged,因此当我更新列表中项目的属性时,UI不会更新。我尝试通过在更改列表项后手动引发事件来实现此目的,但这不起作用。有人可以解释为什么这种方法不起作用?

提前致谢。

3 个答案:

答案 0 :(得分:2)

INotifyPropertyChanged仅适用于实现该接口的对象的实例属性。不是实现接口的属性的属性。如果您希望此功能正常运行,LocationModel需要实施INotifyPropertyChanged。如果您没有LocationModel的源代码,或者由于某种原因无法更改它,则需要在实现INotifyPropertyChanged的包装类中包装您想要响应的所有属性。您可以使用 DynamicProxy(死链接)动态换行 DynamicProxy (cached)

答案 1 :(得分:1)

你可以使用RaisePropertyChanged(null)破解它,它会告诉视图更新所有内容,不推荐,最好的解决方案是实现INPC,或创建一个将为你实现它的LocationWrapper。如果你想变得极端,你可以使用动态对象来代理模型,或者使用动态代理来做同样的事情。

答案 2 :(得分:1)

使用ObservableCollection而不是List。对ObservableCollection内的项目的更改将触发对View的通知。

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