2012-02-28 51 views
0

我们正在使用Model-View-Presenter被动视图策略构建我们的软件。在我们的软件上,我们有一个报告和不同类型的图表。因此,我们必须对图表的抽象类的功能,所有的图表将实施:如何在MVP中为抽象模型创建视图和演示者

abstract class AbstractChart 
{ 
    ... 
} 

然后我们有具体类(模型),可以说,条形图和饼图:

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

有没有原因,你不使用MVVM与WPF? – 2012-02-28 14:00:02

+0

我们尝试过MVVM,但虽然它看起来非常好,但它证明了我们的需求太复杂。 – teemu 2012-02-29 06:51:31

+1

我的经验是MVVM *正确使用*极大地降低了**复杂性。 – 2012-02-29 10:56:00

回答

0

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

0

我只想用WPF DataTemplates告诉WPF如何绘制每个图表类型,当它遇到的一个对象在Visual树

<Application.Resources> 

    <DataTemplate DataType="{x:Type local:BarChart}"> 
     <local:BarChartUserControl /> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type local:PieChart}"> 
     <local:PieChartUserControl /> 
    </DataTemplate> 

</Application.Resources> 

的用户控件背后的DataContext类型仍然是你的对象,这样你就可以建立与期望的用户控件是在DataContext将是BarChart型或PieChart

。例如,一个ItemsControl会提醒你使用每种类型正确的模板,没有额外的编码图表的列表:

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

或者您也可以手动添加图表使用像一个ContentControl

<ContentControl Content="{Binding SomeChartProperty}" /> 

作为一个侧面说明对象的可视化树,我会强烈建议切换到使用,而不是MVP MVVM。它非常适合WPF,并且是使用WPF或Silverlight时使用的标准设计模式。

+0

这将解决为模型创建视图对象的问题,但是谁应该创建相应的演示者? – teemu 2012-02-29 07:03:51

+0

@teemu在使用WPF时,我没有使用过MVP,但是它听起来像是和应用程序代码相关,而不是UI代码,所以我认为它会由ViewModels创建。如果你使用WPF,我强烈推荐切换到MVVM。如果您有兴趣,可以在我的博客上找到[简单MVVM示例](http://rachel53461.wordpress.com/2011/05/08/simplemvvmexample/)。 – Rachel 2012-02-29 13:04:40

相关问题