代码之家  ›  专栏  ›  技术社区  ›  user1702369

模型中的IEnumerable可观察

  •  1
  • user1702369  · 技术社区  · 6 年前

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

    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,让它像一个可观察集合一样工作,而不改变它?我的选择是什么。

    问题是我删除了一个AllowedRiver,然后添加了一个AllowedRiver,UI根本没有更新。这是合乎逻辑的,然后我(出于测试目的)将IEnumerable设置为ObservableCollection,然后UI工作。在继续使用IEnumerable但得到更新时,我还有其他选择吗?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Mihai Alexandru-Ionut    6 年前

    有没有什么方法可以让IEnumerable像 不改变它的可观察收集真的吗?

    您可以创建另一个 Car 班自从你 ObservableCar 继承 汽车 您有权访问的类 AllowedDrivers 所有物

    因此,您可以声明您想要的 observable 集合并使用转换自的可观察集合进行初始化 允许河流 . 此初始化应在内部 get .

    public class ObservableCar: Car {
        public ObservableCar(){
             _observableAllowedDriver = new ObservableCollection<Person>(AllowedDrivers);
        }
        private ObservableCollection<Person> _observableAllowedDriver;
        public ObservableCollection<Person> ObservableAllowedDriver
        {
            get { return _observableAllowedDriver; }
        }
    }
    
        2
  •  1
  •   Clemens    6 年前

    你可以简单地 分配 AllowedDrivers属性的可观察集合,并对该集合进行操作:

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

    现在,向 drivers 集合实际上会更新UI,因为绑定的UI元素会在运行时检查集合是否实现 INotifyCollectionChanged :

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

    当然,以上假设您的 ModelBase.Update 方法没有做任何奇怪的事情,并最终指定 value 属性setter的参数到其支持字段 _allowedDrivers 因此,属性getter返回传递给setter的集合实例。


    编辑:如果可能的话,更改要使用的汽车级别是有意义的 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,但要去掉 驱动程序 变量:

    car.AllowedDrivers = new ObservableCollection<Person>();
    car.AllowedDrivers.Add(new Person(...)); 
    
        3
  •  0
  •   Clemens    6 年前

    谢谢大家的意见。我通过将IEnumerable制作/转换为可观察集合来解决它。

    像这样:

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

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

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