我试图在 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/

10-11 00:28