IEnumerable在Model observable中

时间:2018-01-19 09:55:06

标签: c# wpf ienumerable observablecollection

我遇到的情况是我必须使用现有的模型,我不允许更改现有的属性。

public class Car : ModelBase
{
    private string _model;
    public string Model
    {
        get { return _model; }
        set { this.Update(x => x.Model, () => _model= value, _model, value); }
    }

    private IEnumerable<Person> _allowedDrivers;
    public IEnumerable<Person> AllowedDrivers
    {
        get { return _allowedDrivers; }
        set { this.Update(x => x.AllowedDrivers, () => _allowedDrivers=value, _allowedDrivers, value); }
    }
}

现在我们最近开始实现WPF UI,我需要使用这些现有模型。有没有办法可以使用IEnumerable并让它像ObservableCollection一样工作而不改变它?我有什么选择。

问题是我删除了AllowedDriver,然后添加了AllowedDriver,UI根本没有更新。这是合乎逻辑的,然后我做了(用于测试目的)IEnumerable一个ObservableCollection,然后UI工作。我是否有任何其他选项继续使用IEnumerable但更新?

3 个答案:

答案 0 :(得分:2)

  

有什么方法可以使用IEnumerable并让它像一个工作   ObservableCollection没有真正改变它?

您可以创建另一个继承Car课程的。由于您的ObservableCar继承了Car课程,因此您可以访问AllowedDrivers属性。

因此,您可以声明所需的observable集合,并使用从AllowedDrivers转换的可观察集合进行初始化。此初始化应位于get内。

public class ObservableCar: Car {
    public ObservableCar(){
         _observableAllowedDriver = new ObservableCollection<Person>(AllowedDrivers);
    }
    private ObservableCollection<Person> _observableAllowedDriver;
    public ObservableCollection<Person> ObservableAllowedDriver
    {
        get { return _observableAllowedDriver; }
    }
}

答案 1 :(得分:1)

您只需 ObservableCollection分配给AllowedDrivers属性并对该集合进行操作:

var drivers = new ObservableCollection<Person>();
car.AllowedDrivers = drivers;

现在向drivers集合添加一个新Person将实际更新UI,因为绑定的UI元素会在运行时检查集合是否实现INotifyCollectionChanged

drivers.Add(new Person(...)); 

上面当然假设您的ModelBase.Update方法没有做任何奇怪的事情,并最终将属性设置器的value参数分配给其后备字段_allowedDrivers,以便属性getter返回传递给setter的集合实例。

编辑:如果可能的话,将Car类改为使用ICollection<T>代替IEnumerable<T>是有意义的:

public class Car : ModelBase
{
    ...

    private ICollection<Person> _allowedDrivers;
    public ICollection<Person> AllowedDrivers
    {
        get { return _allowedDrivers; }
        set { this.Update(x => x.AllowedDrivers, () => _allowedDrivers=value, _allowedDrivers, value); }
    }
}

然后你仍然可以分配一个ObservableCollection,但摆脱drivers变量:

car.AllowedDrivers = new ObservableCollection<Person>();
car.AllowedDrivers.Add(new Person(...)); 

答案 2 :(得分:0)

感谢大家的投入。我通过将IEnumerable制作/转换为ObservableCollection来解决它。

像这样:

info.virtual_size

然后在我的viewmodel中使用它,或者我这样使用它:

  public class Car : ModelBase
  {

    public Car()
    {
        AllowedDrivers = new ObservableCollection<Person>();
    }

    private string _model;
    public string Model
    {
        get { return _model; }
        set { this.Update(x => x.Model, () => _model= value, _model, value); }
    }

    private IEnumerable<Person> _allowedDrivers;
    public IEnumerable<Person> AllowedDrivers
    {
        get { return _allowedDrivers; }
        set { this.Update(x => x.AllowedDrivers, () => _allowedDrivers=value, _allowedDrivers, value); }
    }
}