2009-03-19 5 views
1

Я отключил события в этом приложении WPF следующим образом.Как отделить этот пример WPF от MVC, MVP или MVVM?

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

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? Я вижу два пути:
    • я мог либо построить контейнер который содержит все точки зрения и инъекционные контейнер в Клиенту при создании, то клиент может смотреть в контейнере и манипулируют вид вызова в любом случае он хочет (хотя Мне нужно было бы как-то совместить представление, которое отправило событие и представление в контейнере как одно и то же)
    • Я мог как-то отправить весь объект (объект Window) в Model с eventargs при запуске события, хотя модели потребуется некоторый способ узнать (через интерфейс), какие области были доступны для управления во время выполнения
  • Как бы вы продолжали это приложение в направлении более развязанного дизайна?
  • Какой шаблон это на самом деле, например. MVC, MVP, MVVM? Я вижу только представление (оболочка) и модель (клиент).
    • Как мог бы предоставить докладчик?
    • Как бы взорвался ViewModel?
    • Как бы входил контроллер?

ответ

4

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

+0

спасибо, я подозревал это и сейчас читаю статью MSDN по командам: http://msdn.microsoft.com/en-us/magazine/cc785480.aspx –

1

Как говорит Чен, я буду выглядеть в шаблон Command: Routed commands

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

1

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

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

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

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

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

3

Cameron MacFarland сделал здесь хорошую работу, но я могу добавить немного.

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

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

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

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