c# - 当模型中的列表更改时,ViewModel 中的 ObservableCollection 不会更新

标签 c# wpf mvvm mvvm-light observablecollection

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

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

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

我想创建封装 RandomData 属性的 DataViewModel。我需要绑定(bind)到某些 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;}
}

然后在您的 View 模型中将其公开为 ReadOnlyObservableCollection .请注意,ReadOnlyObservableCollection 是对原始 ObservableCollection 的包装。数据未被复制,原始集合的更改通知由 ReadOnlyObservableCollection 反射(reflect)。

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

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

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

关于c# - 当模型中的列表更改时,ViewModel 中的 ObservableCollection 不会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530770/

相关文章:

c# - 为什么 LINQ 在我的查询中使用了错误的数据类型,而在 EF 架构中正确声明了它?

c# - 在 Windows 窗体中单击“确定”按钮时如何使焦点回到窗体?

c# - 从 DynamicResource 为 BorderBrush 设置动画会使用该画笔为所有内容设置动画

c# - 有没有更好的方法来使用 MVVM 模式更新 WPF 中 VisualCollection 主机中的 DrawingVisual?

c# - 我可以在框架方法上使用 SuppressMessage 吗?

.net - 如何使 WPF WebBrowser 只读?

wpf - WPF MVVM 用户控件的最佳实践。避免绑定(bind)问题

wpf - 根据最大按钮的内容均匀大小的按钮

c# - 当 ObservableCollection 触发 CollectionChanged 时,ItemsControl 不会自行更新

wpf - 重构现有代码以使用MVVM模式时,如何解决此术语困惑?