2009-09-16 1 views
0

Я просматривал образцы PRISM 2 для представления о том, как наилучшим образом подходить к новому приложению, над которым я работаю, который будет приложением PRISM 2/WPF. Если посмотреть, в частности, на пример приложения «Вставка изображения», который поставляется с PRISM, я заметил, что все представления реализуют интерфейс, который позволяет презентатору (или ViewModel) взаимодействовать с представлением.MVVM - Должен ли View иметь ссылку на презентатор/ViewModel?

В прошлом я сделал это противоположный путь вокруг, я впрыснуть выступающую в представление, так что представление может непосредственно вызывать к методам на ведущем немного так:

public partial class SomeView : ModuleBase 
    { 

     private ISomePresenter _somePresenter; 

     public SomeView (ISomePresenter somePresenter):this() 
     { 
      // Give the view a reference to the presenter 
      _somePresenter = somePresenter; 
      // Bind the View to the presenter 
      DataContext = _somePresenter; 
     } 

    private void btnSubmit_Click(object sender, RoutedEventArgs e) 
    { 
     // The view can call actions directly on the presenter (OK I should probably use a command for this) 
     _somePresenter.SomeAction(); 
    } 
} 

техник выше, казалось мне достаточно разумным, но, глядя на образцы, я начинаю сомневаться в этом подходе. У кого-нибудь есть мнения (не каламбур), чтобы наилучшим образом пойти об этом?

  • Добавить выступающее мнение и получить представление взаимодействовать с ведущим
  • Добавить вид на ведущий и получить выступающее взаимодействовать с мнением
  • что-то совершенно другое, что я не имею думал еще?

ответ

2

Я думаю, что это все дело вкуса. Лично мне нравится, как вы видите это в образцах, на которые вы смотрите. У IView есть один метод: SetViewModel (...). У IViewModel есть свойство, называемое View of type Object, которое, по сути, возвращает экземпляр IView, созданный DI.

Причина Мне нравится этот путь я почти всегда хочу создать ViewModel первым и я хочу никто в коде, чтобы быть в состоянии сделать что-нибудь с моим IView, за исключением того, получить ссылку на экземпляр (для инъекций зрения или связывая представление, чтобы сказать ContentControl), поэтому его тип объекта. Если какой-либо код должен разговаривать с View, для меня это всегда через виртуальную машину ... и даже тогда представление обновляется обычно через привязку. Было бы странным переходить из View-> ViewModel-> UpdateBinding-> View, чем это, VM-> UpdateBinding-> View

Чтобы ответить на вопрос, мне вообще не нужна ссылка на ведущего в коде. Обычно я могу справиться с тем, что команды из представления связаны с виртуальной машиной. В некоторых случаях вы можете захотеть сохранить ссылку на презентацию, чтобы сделать то, что у вас есть в вашем примере, но этого избежать можно с помощью правильного набора инструментов (что делает SL труднее, если у него нет встроенных команд).

Как я уже сказал, это все дело вкуса ...

-Jer

5

Наиболее распространенный подход для отображения ViewModel к View в MVVM является использование DataTemplate:

<DataTemplate DataType="{x:Type vm:SomeViewModel}"> 
    <v:SomeView /> 
</DataTemplate> 

Когда вы показываете экземпляр ViewModel в ContentControl или ItemsControl, WPF автоматически создает экземпляр соответствующего View для ViewModel и устанавливает вид View в экземпляр ViewModel.

Таким образом, вы не имеете никаких ссылок на представление в ViewModel, а View ссылается только на ViewModel через свойство DataContext.Если вам действительно нужно получить доступ к ViewModel в кодовом коде View, вы всегда можете отбросить DataContext (но это означает, что View знает о фактическом типе ViewModel, который вызывает связь)

+0

Мне было интересно об этом в последнее время. Я почти исключительно использовал DataTemplates, и он начал чувствовать, что DataTemplate - это представление. Это подразумевает, что указание параметра DataType связывает представление с моделью представления. У меня нет проблемы с этим типом связи, но оно противоречило предложению в документе Prism4, в котором говорится: «Точно так же представление в идеале не должно зависеть от какой-либо конкретной реализации модели представления». Для меня вид - это отброшенная часть и в любой момент может быть заменен другим видом. Таким образом, это связано с моделью обзора. – Christo