2012-09-19 4 views
4

У меня вопрос: Где лучшее место для создания ViewModel в MVVM и как?Лучшее место для создания ViewModel в MVVM

1) Создайте один раз в App.xaml.cs как статическое поле, а затем используйте его через приложение?

2) Создайте новый ViewModel в Page.cs, когда я перехожу к этой странице?

3) другие варианты

+0

Я всегда видел его часть и посылку с созданием представления. –

ответ

9

В MVVM, то ViewModel является приложение. Это означает, что я обычно имею одного ViewModel запуска, который является точкой входа в моем приложении, и обычно я создаю экземпляр этого в коде App.xaml.cs OnStartup

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    var app = new ShellView(); 
    var context = new ShellViewModel(); 
    app.DataContext = context; 
    app.Show(); 
} 

Каждый раз в то время у меня есть приложение, которое создаст ViewModel в конструкторе окна запуска, но это не очень предпочтительно, потому что это означает, что если у меня есть логика запуска, я должен поместить это в код за View, а также, и мне не нравится смешение логики приложения в моем слое «Просмотр».

public partial class MainWindow 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new ShellViewModel(); 
    } 
} 

Независимо от того, как вы это делаете, имейте в виду, что при использовании MVVM, ваши ViewModels ваши приложения, а не ваши мнения, так что, как правило, ваши ViewModels связаны каким-либо образом на старте ViewModel. Представления - это просто удобный для пользователя способ взаимодействия с вашим приложением (ViewModels).

+1

Как это работает, когда есть много просмотров с разными ViewModels? Ваш метод OnStartup устанавливает все DataContexts? Что происходит при создании новых представлений? –

+1

Привет Адриан, обычно я только подключаю основные «ShellView» и «ShellViewModel», как это. Я рассказываю WPF, как рисовать остальную часть ViewModels, помещая неявный 'DataTemplate' в' .Resources' приложения где-нибудь. Когда WPF отправится нарисовать ViewModel, он проверит, есть ли «DataTemplate», который он должен использовать, чтобы нарисовать этот ViewModel и использовать его, если это так. – Rachel

+0

Спасибо за то, что Рэйчел. Мне нужна помощь моего коллеги, чтобы распаковать его, потому что я думал, что DataTemplates используются только с ItemsControls. –

1

Вы можете использовать инъекции зависимостей и создать его, как это (если вы используете какой-DI контейнер):

public partial class YourView : UserControl 
{ 
    public YourView (IYourViewModel viewModel) 
    { 
     InitializeComponent(); 
     this.DataContext = viewModel; 
    } 
} 
+0

Вот что я и сделал бы. Однако, предполагая, что вам нужно показать другой UserControl или Dialog из YourView, как бы вы поставляли их с помощью ViewModel, не передавая также свой контейнер DI? – NullAndVoid

+1

Они могут быть введены в их конструкторы, если контейнер их зарегистрировал. Другой вариант, возможно, что у вас есть что-то или что-то вроде свойства другого? –

+0

Правда, но вложение видов в ViewModels создало бы зависимость от уровня представления, который я стараюсь избегать. Как насчет создания какого-то события в ViewModel и пусть какой-то внешний экземпляр - возможно, контроллер - создаст и покажет представление, которое нужно отобразить? – NullAndVoid

1

Существуют различные способы сделать это, зависит от что ты думаешь.

У меня лично есть класс, предназначенный для создания всех необходимых мне объектов, вызываемых в App.xaml.cs. Класс в основном выполняет эти трудоемкие процедуры запуска при отображении заставки. Я создаю оба вида и ViewModels здесь И свяжу их

Это позволяет мне иметь только одну точку, в которой созданы все эти ссылки View-to-ViewModel, я могу вернуться к ней легко, даже если я добавлю/удалите что-нибудь.

Мне не нравится подход, в котором вы инициализируете viewModel в конструкторе каждого представления. Предполагая, что у вас есть 15 просмотров в вашем проекте, у вас будет 15 различных файлов для просмотра, если вы хотите проверить все инициализации ViewModel.

Это мое скромное участие в этом =)

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