【发布时间】:2018-06-28 12:44:51
【问题描述】:
我处于必须使用现有模型的情况下,我不允许更改现有属性。
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 但已更新?
【问题讨论】:
-
IEnumerable对计数、添加和删除一无所知。从理论上讲,它可能是一个无穷无尽的集合。也许你可以创建一个派生类? -
public class Car () : Modelbase...()?Update(....)是什么?Modelbase有System.Collections.Specialized.INotifyCollectionChanged或System.ComponentModel.INotifyPropertyChanged之类的吗? -
“我是否有任何其他选项可以继续使用 IENumerable 但会得到更新?” -- 以“任何其他选项”形式出现的问题总是过于宽泛。当然当然你还有其他选择。但它们是否适用于你的情况,我们无从得知。无论如何,您采取的任何选择都不会像使用
ObservableCollection<T>那样有效。请注意,只要为AllowedDrivers设置的对象实际上是ObservableCollection<T>,它就应该可以工作,即使属性类型 是IEnumerable<T>。 -
@PeterDuniho:这是一个非常明确的问题,正如 Mihai Alexandru-lonut 发布的那样,答案非常明确。这种“所有没有答案的东西,比如 = 2 都必须关闭”形式的节制很糟糕,如果从一开始就这样做,那么就不一样了。
-
@Ignacio: "这是一个非常明确的问题,有一个非常明确的答案" -- 问题很明确,但没有a 明确的答案,它有很多。已经发布了两个完全不同的,并且不乏其他可能的。 “如果从一开始就是这样,那么 SO 就不一样了”——首先,SO 已经不“相同”。其次,有许多来自“早期”的问题在今天是不能容忍的,这是有充分理由的。这就是这些年来提问指南发生变化的原因和方式。
标签: c# wpf ienumerable observablecollection