C# 可观测模型中的IEnumerable
我所处的情况是,我必须使用现有模型,但不允许我更改现有属性C# 可观测模型中的IEnumerable,c#,wpf,ienumerable,observablecollection,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); } } priva
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); }
}
}
公共级汽车:车型库
{
私有字符串模型;
公共字符串模型
{
获取{return\u model;}
设置{this.Update(x=>x.Model,()=>\u Model=value,\u Model,value);}
}
私人可数河流;
公共可数河流
{
获取{return\u;}
设置{this.Update(x=>x.AllowedDrivers,()=>\u AllowedDrivers=value,\u AllowedDrivers,value);}
}
}
现在我们最近开始实现WPF UI,我需要使用这些现有模型。我有没有办法使用IEnumerable,让它像一个可观察的集合一样工作,而不改变它?我的选择是什么
问题是我删除了AllowedRiver,然后添加了AllowedRiver,UI根本没有更新。这是合乎逻辑的,然后我(出于测试目的)将IEnumerable设置为ObservableCollection,然后UI工作。在继续使用IEnumerable但得到更新时,我还有其他选择吗
有什么方法可以让IEnumerable像一个
在不改变它的情况下观察到的收集真的吗
您可以创建另一个继承您的汽车类的类。由于您的observecar
继承了Car
类,因此您可以访问allowedrivers
属性
因此,您可以声明所需的observable
集合,并使用从allowedrivers
转换的可观测集合进行初始化。此初始化应该在get
内
public class ObservableCar: Car {
public ObservableCar(){
_observableAllowedDriver = new ObservableCollection<Person>(AllowedDrivers);
}
private ObservableCollection<Person> _observableAllowedDriver;
public ObservableCollection<Person> ObservableAllowedDriver
{
get { return _observableAllowedDriver; }
}
}
公共类车辆:汽车{
公共可观测{
_ObservableLowedDriver=新的ObservableCollection(AllowedDriver);
}
私有可观察收集_observeablelowdriver;
公共可观察收集可观察的LowedDriver
{
获取{return}
}
}
您只需将ObservableCollection分配给AllowedDrivers属性并对该集合进行操作:
var drivers = new ObservableCollection<Person>();
car.AllowedDrivers = drivers;
当然,上面假设您的ModelBase.Update
方法没有做任何奇怪的事情,并最终将属性setter的value
参数分配给其backing字段\u
,以便属性getter返回传递给setter的集合实例
编辑:如果可能的话,将汽车类别更改为使用ICollection
而不是IEnumerable
:
谢谢大家的意见。我通过将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); }
}
}
公共级汽车:车型库
{
公共汽车
{
AllowedDrivers=新的ObservableCollection();
}
私有字符串模型;
公共字符串模型
{
获取{return\u model;}
设置{this.Update(x=>x.Model,()=>\u Model=value,\u Model,value);}
}
私人可数河流;
公共可数河流
{
获取{return\u;}
设置{this.Update(x=>x.AllowedDrivers,()=>\u AllowedDrivers=value,\u AllowedDrivers,value);}
}
}
然后在我的viewmodel中使用它,或者我这样使用它:
var allowedDrivers = (ObservableCollection<Person>)Car.AllowedDrivers;
allowedDrivers.Add(person)
var allowedDrivers=(ObservableCollection)Car.allowedDrivers;
AllowedRivers.Add(个人)
IEnumerable
对计数、添加和删除一无所知。理论上,这可能是一个无止境的收藏。也许您可以创建一个派生类?公共类Car():Modelbase
<代码>()
?更新了什么(…)
?是否有Modelbase
任何类似System.Collections.Specialized.INotifyCollectionChanged
或System.ComponentModel.inotifpropertychanged
?“我是否有任何其他选项可以继续使用IENumerable但得到更新?”——以“任何其他选项”形式出现的问题总是过于广泛。当然你还有其他选择。但他们是否适用于你的情况,我们无法知道。不管怎样,您采取的任何选项都不会像使用ObservableCollection
那样有效。请注意,只要为allowedrivers
设置的对象实际上是一个observeCollection
,它就应该可以工作,即使属性类型是IEnumerable
@PeterDuniho:正如Mihai Alexandru lonut所发布的那样,这是一个非常清楚的问题,答案也非常清楚。这种“没有答案的一切,比如=2,都必须关闭”的节制很糟糕,所以如果从一开始就这样做的话,情况就不一样了。@Ignacio:“这是一个非常清楚的问题,有一个非常清楚的答案”——这个问题很清楚,但它没有一个明确的答案,它有很多。已经有两个完全不同的帖子发布了,而且不缺少其他可能的帖子。“如果从一开始就这样做,那就不一样了”——首先,所以已经不“一样了”。第二,有许多来自“早期”的问题今天是不能容忍的,这是有充分理由的。这就是为什么问问题指导原则在过去几年中发生了变化,以及如何发生变化。请注意,为了能够添加元素,只需将其转换为ICollection
,如((ICollection)Car.allowedrivers)。添加(person)
。将视图模型更改为包含公共ICollection{get;set;}
,这将非常有意义。然后,您只需编写Car.AllowedDrivers.Add(person)
。
car.AllowedDrivers = new ObservableCollection<Person>();
car.AllowedDrivers.Add(new Person(...));
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)