如何将observebale集合绑定到模型中的集合

时间:2017-07-11 20:26:21

标签: c# wpf mvvm data-binding

基本上这是一个与this one非常相似的问题,差别很大,我不能轻易“只在模型中使用一个可观察的集合”;一个很好的例子是字典的密钥收集。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;

public class Data
{
    private Dictionary<String, String> _randomData;
    public Data()
    {
        _randomData = new Dictionary<String, String>();
    }

    public ICollection<string> RandomDataKeys {
        get {
            return _randomData.Keys;
        }
    }

    public void AddElement(string k, string v) {
        _randomData[k] = v;
    }
}


public class DataViewModel
{
    private Data _data;

    public DataViewModel(Data data)
    {
        _data = data;
        RandomData = new ObservableCollection<String>(_data.RandomDataKeys);
        //obviously above wouldn't work, since it just copies the keys.
    }

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

现在常见的方法是什么?备份是更改“add”函数以告诉viewmodel添加了一个新项目(但这需要模型获得有关viewmodel的信息,在viewmodel上显式调用一个函数来告诉viewmodel保留一个副本模型的数据,这感觉浪费和缓慢)。

1 个答案:

答案 0 :(得分:0)

问题是,当您执行此操作RandomData = new ObservableCollection<String>(_data.RandomDataKeys);时,您基本上会创建一个新的集合实例。因此,当您更新_data.RandomDataKeys时,此更改不会反映在您的可观察集合中。 请阅读this 最好的方法是在Data类中使用ObservableCollection,但如果你不想这样做,你可以改变你的

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

public ObservableCollection<String> RandomData 
{    
    get { return new ObservableCollection(_data.RandomDataKeys); }
}

绝对不是一个好主意,每次都要创建新的集合。 因此,您可以尝试在Data类中实现INotifyPropertyChanged接口,并直接绑定到_data.RandomDataKeys