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需要实施。INotifyPropertyChanged如果您没有 LocationModel 的源代码,或者由于任何原因无法更改它,则需要将所有要对其做出反应的属性包装在实现INotifyPropertyChanged. 您可以使用DynamicProxy (dead link) DynamicProxy (cached)动态包装。

于 2012-06-29T16:56:16.820 回答
1

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

于 2012-06-28T16:30:12.907 回答
1

使用 ObservableCollection 而不是 List。对 ObservableCollection 中的项目的更改将触发对视图的通知。

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 回答