我试图在 ListBox 中公开两个派生类型:OutFlight 和 InFlight 都派生自 Flight,这是一种抽象类型。
MVVM 说我必须为 ListBox 的绑定(bind)模型设置一个 ViewModel。 exposig 一种类型并不是什么大问题,但我的列表框包含两种派生类型,我正在寻找最好的 MVVM 方法。这是否意味着我必须为每个派生类型设置继承的 ViewModel?我读过某处根本不推荐 ViewModel 继承......我确定这是一个非常常见的情况
最佳答案
您可以创建一个通用 View 模型 FlightViewModel 来封装 OutFlight 和 InFlight 实体。因此 FlightViewModel 具有所有公共(public)属性,并且是基于 OutFlight 和 InFlight 实体构造的(例如通过将它们传递到构造函数中)。它可以有一个额外的属性,表明它是一个outflight 还是inflight(作为一个枚举或其他东西)。
这样做使 FlightViewModel 基本上是您的具体类型 OutFlight 和 InFlight 的抽象。 FlightViewModel 也将只包含您在 View 中实际需要的属性并以正确的格式包含,以便 View 可以轻松使用它。
然后您的 View 的 View 模型将具有 FlightViewModel 对象的集合。
public class FlightViewModel
{
private Flight _flight;
public FlightViewModel(OutFlight outFlight)
{
FlightNumber = outFlight.FlightNumber;
FlightType = FlightType.OutFlight;
_flight = outFlight;
}
public FlightViewModel(InFlight inFlight)
{
FlightNumber = inFlight.FlightNumber;
FlightType = FlightType.InFlight;
_flight = inFlight;
}
public int FlightNumber
{
get { return _flight.FlightNumber; }
set { _flight.FlightNumber = value; }
}
public FlightType FlightType { get; set; }
... other properties
}
这当然只是一个例子,但你明白了。
关于c# - MVVM - 具有多态性的集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15923230/