我想在一个ListBox中展示两个派生类型:OutFlight和InFlight,它们都是由抽象类型Flight派生而来的。
MVVM模式要求我为ListBox的绑定模型设置一个ViewModel。对于暴露一个类型来说这不是什么大问题,但我的ListBox包含了两个派生类型,我正在寻找最佳的MVVM方法。这是否意味着我必须为每个派生类型设置继承的ViewModel?我曾经在某处读到过不推荐使用ViewModel继承... 我相信这是一个非常普遍的情况
我想在一个ListBox中展示两个派生类型:OutFlight和InFlight,它们都是由抽象类型Flight派生而来的。
MVVM模式要求我为ListBox的绑定模型设置一个ViewModel。对于暴露一个类型来说这不是什么大问题,但我的ListBox包含了两个派生类型,我正在寻找最佳的MVVM方法。这是否意味着我必须为每个派生类型设置继承的ViewModel?我曾经在某处读到过不推荐使用ViewModel继承... 我相信这是一个非常普遍的情况
public class FlightViewModel : INotifyPropertyChanged
{
public Flight Flight { get; set; }
public int PropertyYouNeedForInFlight { get; set; }
public string PropertyYouNeedForOutFlight { get; set; }
}
public class MainWindowViewModel
{
public ObservableCollection<ViewModelBase> Flights { get; set; }
public MainWindowViewModel()
{
Flights = new ObservableCollection<ViewModelBase>();
Flights.Add(new InFlightViewModel());
Flights.Add(new OutFlightViewModel());
}
}
public class FlightTemplateSelector : DataTemplateSelector
{
public DataTemplate InFlightTemplate { get; set; }
public DataTemplate OutFlightTemplate { get; set; }
public override DataTemplate SelectTemplate(object item,
DependencyObject container)
{
if(item.GetType() == typeof(InFlight))
return InFlightTemplate;
if(item.GetType() == typeof(OutFlight))
return OutFlightTemplate
//Throw exception or choose some random layout
throw new Exception();
}
}
<local:FlightTemplateSelector
x:Key="FlightTemplateSelector">
<local:FlightTemplateSelector.InFlightTemplate>
<!-- Define your layout here -->
</local:FlightTemplateSelector.InFlightTemplate>
<!-- Define your layout here -->
<local:FlightTemplateSelector.OutFlightTemplate>
</local:FlightTemplateSelector.OutFlightTemplate>
</local:FlightTemplateSelector>
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
}
这只是一个例子,你可以理解一下。