如何在MVP中为抽象模型创建视图和演示者

时间:2012-02-28 13:49:47

标签: c# wpf mvp

我们正在使用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.
        }
    }
} 

2 个答案:

答案 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的类型为BarChartPieChart

例如,ItemsControl将使用每种类型的正确模板绘制图表列表,而无需额外编码:

<ItemsControl ItemsSource="{Binding Charts}" />

或者您可以使用类似ContentControl

的内容手动将图表对象添加到可视树中
<ContentControl Content="{Binding SomeChartProperty}" />

作为旁注,我强烈建议切换到使用MVVM而不是MVP。它非常适合WPF,是使用WPF或Silverlight时使用的标准设计模式。

答案 1 :(得分:0)

由于缺乏更好的想法,我通过创建一个为模型创建适当的演示者的Factory类来解决这个问题。现在我在他们的演示者中创建了视图,尽管使用像Unity这样的IoC容器会更好。