在模型中可观察的 IEnumerable



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

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一样工作而无需真正更改它?我有什么选择。

问题是我删除了一个允许的驱动程序,然后添加一个允许的驱动程序,并且 UI 根本没有更新。这是合乎逻辑的,然后我(出于测试目的(将IEnumerable制作为可观察集合,然后UI就可以工作了。我还有其他选择继续使用 IEnumerable 但会更新吗?

有什么方法可以使用IEnumerable并让它像 可观察集合而不真正改变它?

您可以创建另一个继承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; }
    }
}
只需将

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

var drivers = new ObservableCollection<Person>();
car.AllowedDrivers = drivers;
现在,向

drivers集合添加新的人员实际上将更新 UI,因为绑定的 UI 元素会执行运行时检查集合是否实现INotifyCollectionChanged

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

当然,上面假设您的 ModelBase.Update 方法没有执行任何奇怪的操作,并最终将属性 setter 的 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(...)); 

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

这样:

  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); }
    }
}

然后在我的视图模型中使用它,或者我像这样使用它:

 var allowedDrivers = (ObservableCollection<Person>)Car.AllowedDrivers;
 allowedDrivers.Add(person)

相关内容

  • 没有找到相关文章

最新更新