Как создать представления и презентаторы для абстрактных моделей в MVP - PullRequest
0 голосов
/ 28 февраля 2012

Мы строим наше программное обеспечение с помощью стратегии пассивного просмотра Model-View-Presenter.На нашем программном обеспечении у нас есть отчет и различные виды графиков.Итак, у нас есть абстрактный класс для диаграммы для функций, которые будут реализованы во всех диаграммах:

abstract class AbstractChart
{
    ...
}

Затем у нас есть конкретные классы (модели), скажем, BarChart и PieChart:

class BarChart: AbstractChart
{
    ...
}
class PieChart: AbstractChart
{
    ...
}

AОтчет может содержать различные типы диаграмм.

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 голосов
/ 08 марта 2012

В отсутствие лучшей идеи я решил эту проблему, создав класс Factory, который создает подходящий презентатор для модели. На данный момент у меня есть представление, созданное в их презентаторах, хотя было бы лучше использовать IoC-контейнер, такой как Unity.

0 голосов
/ 28 февраля 2012

Я бы просто использовал WPF DataTemplates, чтобы сообщить WPF, как рисовать каждый тип диаграммы, когда он встречает объект этого типа в визуальном дереве

<Application.Resources>

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

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

</Application.Resources>

DataContext за UserControl будет по-прежнемубыть вашим объектом, так что вы можете построить UserControl с ожиданием, что DataContext будет иметь тип BarChart или PieChart

Например, ItemsControl будет рисовать ваш список диаграмм, используя правильный шаблондля каждого типа без дополнительной кодировки:

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

Или вы можете вручную добавить свой объект диаграммы в визуальное дерево, используя что-то вроде ContentControl

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

В качестве примечания,Я очень рекомендую перейти на использование MVVM вместо MVP.Он идеально подходит для WPF и является стандартным шаблоном проектирования, используемым при работе с WPF или Silverlight.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...