いくつかの方法があります。1 つの方法は、Flight クラスの ViewModel を作成し、それらの "FlightViewModel" オブジェクトでコレクションを埋めることです。その ViewModel には、「Flight」から継承するすべてのオブジェクトを含めることができます。「InFlight」および「OutFlight」クラスがそれほど複雑でない場合は、それらを 1 つの ViewModel (ここでは「FlightViewModel」) にラップします。
public class FlightViewModel : INotifyPropertyChanged
{
public Flight Flight { get; set; }
public int PropertyYouNeedForInFlight { get; set; }
public string PropertyYouNeedForOutFlight { get; set; }
}
もう 1 つの方法は、いくつかの基本 ViewModel タイプのコレクションを ListBox ItemsSource として使用することです。このコレクションには、「InFlightViewModel」タイプの ViewModel と「OutFlightViewModel」タイプのその他の ViewModel が含まれています。ListBox アイテムの場合、アイテムのタイプに適した ItemTemplate を選択する ItemTemplateSelector を作成できます。
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>