gpt4 book ai didi

c# - MVVM - 具有多态性的集合

转载 作者:太空狗 更新时间:2023-10-30 00:42:22 25 4
gpt4 key购买 nike

我试图在 ListBox 中公开两个派生类型:OutFlight 和 InFlight 都派生自抽象类型 Flight。

MVVM 说我必须为 ListBox 的绑定(bind)模型设置一个 ViewModel。暴露一种类型没什么大不了的,但我的列表框包含两种派生类型,我正在寻找最好的 MVVM 方法。这是否意味着我必须为每个派生类型设置继承的 ViewModel?我在某个地方读过根本不推荐 ViewModel 继承......我敢肯定这是一个非常常见的情况

最佳答案

有几种方法。一种方法是为您的 Flight 类编写一个 ViewModel,并用这些“FlightViewModel”对象填充一个集合。该 ViewModel 可以包含从“Flight”继承的所有对象。如果您的“InFlight”和“OutFlight”类不是那么复杂,我会将它们包装在一个 ViewModel(此处为“FlightViewModel”)中。

public class FlightViewModel : INotifyPropertyChanged
{
public Flight Flight { get; set; }

public int PropertyYouNeedForInFlight { get; set; }
public string PropertyYouNeedForOutFlight { get; set; }
}

另一种方法 是使用一些基本 ViewModel 类型的集合作为 ListBox ItemsSource。该集合包含一些“InFlightViewModel”类型的 ViewModel 和一些其他“OutFlightViewModel”类型的 ViewModel。对于您的 ListBox 项,您可以编写一个 ItemTemplateSelector 来为项的类型选择正确的 ItemTemplate。

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>

关于c# - MVVM - 具有多态性的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15923230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com