我遇到的情况是我必须使用现有的模型,我不允许更改现有的属性。
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但更新?
答案 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); }
}
}