2010-05-05 4 views
4

Я новичок в мире WvF & Mvvm, но я нашел несколько примеров и только что нашел, что существует несколько способов создания экземпляра модели. Я хотел бы знать лучший/правильный способ сделать это. оба способа используют UnityWPF + MvvM + Prism

Что я foud:

var navigatorView = new MainView(); 
navigatorView.DataContext = m_Container.Resolve<INavigatorViewModel>(); 
m_RegionManager.Regions["NavigatorRegion"].Add(navigatorView); 

Что я сделал:

var navigatorView = m_Container.Resolve<MainView>; 
m_RegionManager.Regions["NavigatorRegion"].Add(navigatorView); 

и я изменил конструктор получить ViewModel, поэтому я могу указать DataContext к нему:

public MainView(NavigatorViewModel navigatorViewModel) 
{ 
this.DataContext = navigatorViewModel; 
} 

Другие примеры, которые я нашел еще один способ, как:

...vm = new viewmodel 
...m = new model 
v.model = vm; 

получить/установить DataContext

веселит

ответ

0

Что там у вас имеет смысл, и в обоих случаях является показам первый подход к созданию ViewModel. То есть представление создает ViewModel. В исходном примере viewmodel создается вне представления (и иногда упоминается как marriage pattern), но, насколько мне известно, это одно и то же - создание представления создает ViewModel.

Если вам это подходит, придерживайтесь его. Другой подход, вы можете смотреть на это ViewModel первый, где ViewModel принимает зависимость от точки зрения так:

//In the bare-bones(i.e. no WPF dependencies) common interface assembly 

interfac IView { 
    void ApplyViewModel(object viewmodel); 
}  

interface IMainView : IView { 
    //this interface can actually be empty. 
    //It's only used to map to implementation. 
} 

//In the ViewModel assembly 

class MainViewModel { 
    public MainViewModel(IMainView view) { 
    view.ApplyViewModel(this); 
    } 
} 

public partial class MainView : UserControl, IMainView { 
    void ApplyViewModel(object viewmodel){ 
    DataContext = viewmodel; 
    } 
} 

Затем вы можете вводить этот вид, как так:

IRegion region = regionManager.Regions["MainRegion"]; 

//This might look strange as we are resolving the class to itself, not an interface to the class 
//This is OK, we want to take advantage of the DI container 
//to resolve the viewmodel's dependencies for us, 
//not just to resolve an interface to the class. 
MainViewModel mainViewModel = container.Resolve<MainViewModel>(); 

region.Add(mainViewModel.View, "MainView"); 
region.Activate(ordersView.View); 
8

мне нравится предложение Игоря, но без viewmodel, обладающих знаниями о представлении. Я предпочитаю, чтобы мои зависимости проходили в одном направлении (View -> ViewModel -> Model).

Что я делаю, это ViewModel-First и просто DataTemplate viewmodel. Так что я делаю это:

MainViewModel mainViewModel = container.Resolve<MainViewModel>(); 

region.Add(mainViewModel, "MainView"); 
region.Activate(mainViewModel); 

С добавлением ViewModel -> Вид отображения сделано с DataTemplate WPF (я не думаю, что этот подход можно с помощью Silverlight, хотя)

App.xaml:

<Application.Resources> 
    <DataTemplate DataType="{x:Type viewModels:MainViewModel}"> 
      <views:MainView /> 
    </DataTemplate> 
</Application.Resources> 

Всё! Мне нравится этот подход. Мне нравится, как он выглядит как магия. Она также имеет следующие преимущества:

  • не должен изменять конструкторы в соответствии отображение
  • Не нужен зарегистрировать тип для IMyViewModel в контейнере ... вы можете работать с конкретными типами. Мне нравится вести регистрацию в таких сервисах, как IViewRegistry или ILogger ...эти виды вещей
  • Вы можете изменить отображение, используя ресурсы, определенные для определенного вида, в котором находится регион (это хорошо, если вы хотите повторно использовать свои ViewModels, но хотите, чтобы они выглядели по-разному в разных областях приложения.
+3

Это подход, который большинство из нас используют «традиционные» разработчики MVVM ... проблема использования DataTemplate при введении PRISM была очень упущена или запуталась в использовании примеров MVP. +1 –

Смежные вопросы