我们正在使用Model-View-Presenter被动视图策略构建我们的软件。在我们的软件上,我们有一份报告和不同类型的图表。因此,我们有一个抽象类,用于所有图表将实现的函数的图表:
abstract class AbstractChart
{
...
}
然后我们有具体的类(模型),比如BarChart和PieChart:
class BarChart: AbstractChart
{
...
}
class PieChart: AbstractChart
{
...
}
报告可以包含不同类型的图表。
class Report
{
public List<AbstractChart> Charts {get; set; }
...
}
因此,我们在报告上绘制不同的图表时遇到问题:
class ReportPresenter
{
Report _report;
ReportView _view;
...
FillReportView(Report report)
{
foreach(AbstractChart chart in _report.Charts)
{
// Here is the problem: How do we create correct
// view and presenter for abstract chart? We need to
// create them, so we can add chart view to _view.
}
}
}
答案 0 :(得分:0)
我只是使用WPF DataTemplates
告诉WPF如何在Visual Tree中遇到该类型的对象时绘制每种图表类型
<Application.Resources>
<DataTemplate DataType="{x:Type local:BarChart}">
<local:BarChartUserControl />
</DataTemplate>
<DataTemplate DataType="{x:Type local:PieChart}">
<local:PieChartUserControl />
</DataTemplate>
</Application.Resources>
UserControl后面的DataContext
仍然是您的对象,因此您可以构建UserControl,期望DataContext的类型为BarChart
或PieChart
例如,ItemsControl
将使用每种类型的正确模板绘制图表列表,而无需额外编码:
<ItemsControl ItemsSource="{Binding Charts}" />
或者您可以使用类似ContentControl
<ContentControl Content="{Binding SomeChartProperty}" />
作为旁注,我强烈建议切换到使用MVVM而不是MVP。它非常适合WPF,是使用WPF或Silverlight时使用的标准设计模式。
答案 1 :(得分:0)
由于缺乏更好的想法,我通过创建一个为模型创建适当的演示者的Factory类来解决这个问题。现在我在他们的演示者中创建了视图,尽管使用像Unity这样的IoC容器会更好。