繁体   English   中英

当Model中的List发生更改时,ViewModel中的ObservableCollection不会更新

[英]ObservableCollection in ViewModel is not updated when a List changes in Model

假设我有一个模型类Data ,我想为它创建DataViewModelDataView 数据类如下所示:

public class Data
{
    public Data()
    {
        RandomData = new List<String>();
    }

    public List<String> RandomData {get; set;}
}

我想创建封装RandomData属性的DataViewModel 我需要绑定到某个ListView中的RandomData属性,并在底层模型的RandomData更改时更新它。

如果我这样做:

public class DataViewModel
{
    private Data _data;

    public DataViewModel(Data data)
    {
        _data = data;
        RandomData = new ObservableCollection<String>(_data.RandomData);
    }

    public ObservableCollection<String> RandomData {get; set;}
}

然后我没有收到任何更新。 (我知道这只是复制列表,我只是用它来解决问题)。 如果我在RandomData属性上使用了INotifyPropertyChanged,那么我只会收到分配给它的新列表的通知。 如何检查内容的更改? 这样做的首选方式是什么?

谢谢你的任何建议

对于这个具体的例子,我很想改变你的模型以使用ObservableCollection

public class Data
{
    public Data()
    {
        RandomData = new ObservableCollection<String>();
    }

    public ObservableCollection<String> RandomData {get; set;}
}

然后在您的视图模型中将其公开为ReadOnlyObservableCollection 请注意,ReadOnlyObservableCollection是原始ObservableCollection的包装器。 不会复制数据,并且ReadOnlyObservableCollection会反映原始集合中的更改通知。

public class DataViewModel
{
    public DataViewModel(Data data)
    {
        RandomData = new ReadOnlyObservableCollection<String>(data.RandomData);
    }

    public ReadOnlyObservableCollection<String> RandomData {get; private set;}
}

这假设您希望视图模型RandomData当然是只读的。

我相信要注意您想要使用INotifyCollectionChanged的现有集合中的更改。

http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.aspx

实现此接口可能是一种很好的使用方法。 但是我相信MVVM模型文章, http://msdn.microsoft.com/en-us/magazine/dd419663.aspx ,在MSDN中,Josh Smith甚至没有使用这个界面。 我知道在他给出的例子中,他将客户添加到一个类似于以下逻辑的集合中:

void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.NewItems != null && e.NewItems.Count != 0)
                foreach (CustomerViewModel custVM in e.NewItems)
                    custVM.PropertyChanged += this.OnCustomerViewModelPropertyChanged;

            if (e.OldItems != null && e.OldItems.Count != 0)
                foreach (CustomerViewModel custVM in e.OldItems)
                    custVM.PropertyChanged -= this.OnCustomerViewModelPropertyChanged;
        }

选项1(稍微偏离MVVM但有效)。 将此添加到您的View代码隐藏的OnNagivatedTo,它将随时刷新数据:

protected override void OnNavigatedTo(NavigationEventArgs e) {
this.DataContext = new YourViewModel();
}

选项2:

 raise RaisePropertyChanged(YourItem);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM