Как дополнительно развязать этот пример WPF с MVC, MVP или MVVM? - PullRequest
2 голосов
/ 19 марта 2009

Я отделил события в этом приложении WPF следующим образом.

Какой лучший способ продолжить разделение?

Shell.xaml:

<Button x:Name="btnProcess"
        Content="Process"
        Margin="10"/>

Bootstrapper.cs:

public void Run()
{
    Shell shell = new Shell(new Customer());
    shell.Show();
}

Shell.xaml.cs:

public Shell(IPerson person)
{
    InitializeComponent();
    btnProcess.Click +=new RoutedEventHandler(person.Process);
}

Customer.cs:

public class Customer : IPerson
{
    public void Process(object sender, RoutedEventArgs e)
    {
        Button theButton = (Button)sender;
        theButton.Content = "Customer processed.";
    }
}

Приведенный выше код успешно отделяет представление Shell от модели Customer:IPerson, так что я могу поменять местами, например, модель Employee:IPerson и т. д., которая обрабатывает «Обработано» по-своему. Это была первая цель.

Но сейчас:

  • как мне отделить метод Processed от непосредственного разговора с кнопкой , чтобы он также мог общаться с MenuItem или ListView, который запускает событие в представлении и, таким образом, не ' даже должен быть элементом, который его вызывает, например, тестовый модуль?
  • как изменить другие элементы представления , кроме отправителя (кнопка), например, Как бы я изменил строку состояния в Shell? Я вижу два пути:
    • Я мог бы либо построить контейнер , который содержит все представления и внедрить контейнер в Customer при создании, тогда клиент может посмотреть в контейнере и манипулировать вызывающим представлением в любом случае (хотя я бы чтобы как-то соответствовать представлению, которое отправило событие, и представлению в контейнере как одно и то же)
    • Я мог бы каким-то образом отправить целое представление (объект Window) в модель с аргументами при запуске события, хотя модели потребовался бы некоторый способ узнать (через интерфейс), какие виды регионов были доступны манипулировать во время выполнения
  • Как бы вы продолжили это приложение в направлении более отделенного дизайна?
  • Что это за образец на самом деле, например MVC, MVP, MVVM? Я вижу только вид (Shell) и Модель (Заказчик).
    • Как подойдет ведущий?
    • Как бы подошел ViewModel?
    • Как будет вписываться контроллер?

Ответы [ 4 ]

5 голосов
/ 19 марта 2009

Я предлагаю вам реализовать обработку событий, используя команды вместо классических событий. В WPF это очень просто, потому что шаблон команды уже реализован, и вы можете сказать всем своим входам пользовательского интерфейса (кнопка, пункт меню ...), что их команда [имя вашей команды], и обрабатывать их все в одном месте.

3 голосов
/ 20 марта 2009

Кэмерон МакФарланд хорошо поработал, но я могу добавить немного.

При следовании за M-V-VM инструментами в вашей коробке для развязки являются привязка данных, команды, прикрепленные поведения и интерфейсы. Привязка данных должна быть самоочевидной. Вы уже получили хорошее описание команд, но я бы посоветовал вам избегать RoutedCommand и придерживаться реализации ICommand. Прикрепленные поведения - это прикрепленные объекты DependencyProperty, которые подписываются на события в элементе, к которому они присоединены, и в этом сценарии будут использоваться для передачи обработки событий в ViewModel. Интерфейсы дают вам максимальную гибкость, но вы должны решить, как передать интерфейс в ViewModel. Лучший способ узнать все это прямо сейчас - это обратиться к Google и посмотреть на существующие платформы M-V-VM. Вот список фреймворков:

  • Prism / Composite WPF (http://www.codeplex.com/CompositeWPF).) Эта статья взята из группы Microsoft Patterns & Practices. Здесь много хороших вещей, но один из примеров трех приведенных выше вещей, которые вы можете узнать здесь как использовать ICommand. Prism включает DelegateCommand, который реализует ICommand и упрощает использование команд из ViewModel в MV-VM.

  • Caliburn (http://www.codeplex.com/caliburn). Недавно выпущенный, одна из ключевых вещей, которую вы можете узнать из этого, - как использовать прикрепленные поведения, которые эта библиотека использует для своих «Действия».

  • Onyx (http://www.codeplex.com/wpfonyx). Отказ от ответственности: я являюсь автором этого. Этот еще не был выпущен, хотя текущий альфа-источник доступен. Этот предоставляет новое решение для Проблема в том, как предоставить интерфейсы для вашей ViewModel.

1 голос
/ 19 марта 2009

как мне отделить Обработанный метод от разговора конкретно с Кнопкой
Команды. Поместите команду в интерфейс IPerson и вызовите эту команду из xaml командной консоли.

как изменить другие элементы представления
Свойства и Связывание. Если у вас есть свойство, отображающее состояние (обработано / не обработано), вы можете использовать привязку для отображения этого свойства непосредственно в xaml.

Как бы вы продолжили
Я бы пошел дальше по пути MVVM, создав ViewModel между Shell и IPerson. ViewModel имеет 1) свойства, необходимые для привязок, и 2) любые команды, которые необходимо выполнить. ViewModel предназначен для предоставления пользовательскому интерфейсу того, что ему нужно от модели.

Что это за образец
В настоящее время? Ничего такого. Я вижу только два объекта, вид и модель. У вас нет Presenter, Controller или ViewModel.

Для WPF я предпочитаю ViewModel. См. этот вопрос для получения дополнительной информации о MVVM.

1 голос
/ 19 марта 2009

Как подсказывает Чен, я бы посмотрел на шаблон команд: Маршрутизированные команды

Рабочий пример, из которого я многому научился, можно найти в его блоге Хайме Родрикеса: Southridge

...