可观察模型中的 IEnumerable
IEnumerable in Model observable
我的情况是我必须使用现有的模型,但不允许我更改现有的属性。
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 但会更新?
Is there any way I can use the IEnumerable and let it work like a
ObservableCollection without changing it really?
您可以创建另一个 class 来继承您的 Car
class。由于您的 ObservableCar
继承了 Car
class,您可以访问 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
集合添加一个新的 Person 实际上会更新 UI,因为绑定的 UI 元素会在运行时检查集合是否实现了 INotifyCollectionChanged
:
drivers.Add(new Person(...));
以上当然假设你的 ModelBase.Update
方法没有做任何奇怪的事情,并最终将 属性 setter 的 value
参数分配给它的支持字段 _allowedDrivers
以便 属性 getter returns 传递给 setter.
的集合实例
编辑:如果可能的话,将 Car class 更改为使用 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(...));
感谢大家的参与。我通过 making/casting IEnumerable 到 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)
我的情况是我必须使用现有的模型,但不允许我更改现有的属性。
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 但会更新?
Is there any way I can use the IEnumerable and let it work like a ObservableCollection without changing it really?
您可以创建另一个 class 来继承您的 Car
class。由于您的 ObservableCar
继承了 Car
class,您可以访问 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
集合添加一个新的 Person 实际上会更新 UI,因为绑定的 UI 元素会在运行时检查集合是否实现了 INotifyCollectionChanged
:
drivers.Add(new Person(...));
以上当然假设你的 ModelBase.Update
方法没有做任何奇怪的事情,并最终将 属性 setter 的 value
参数分配给它的支持字段 _allowedDrivers
以便 属性 getter returns 传递给 setter.
编辑:如果可能的话,将 Car class 更改为使用 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(...));
感谢大家的参与。我通过 making/casting IEnumerable 到 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)