2012-12-11 5 views
0

В шаблоне MVVM у меня есть один общий ViewModel, используемый 3 пользовательскими элементами управления. Я создавал экземпляр ViewModel и передавал его как параметр конструкторам пользовательских элементов управления, но это прерывает XAML, который требует, чтобы объекты были сконструированы с безпараметрическими кондукторами.ViewModel, используемый несколькими видами

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

+3

Просто назначьте его свойству DataContext. –

ответ

0

Вы можете иметь базовый вид, который будет инициализировать ViewModel

+0

Что загружается в начальное окно? –

2

Вы можете создать ViewModel для MainWindow, который содержит свойство типа SharedViewModel: public SharedViewModel SharedViewModel {get;set;}. Вы можете установить DataContext вашего окна для вашего MainViewModel и связываются с общим ViewModel как:

<Window> 
    <Grid> 
     <UserControl1 DataContext="{Binding Path=SharedViewModel}"/> 
     <UserControl2 DataContext="{Binding Path=SharedViewModel}"/> 
     <UserControl3 DataContext="{Binding Path=SharedViewModel}"/> 
    </Grid> 
</Window> 
1

Dependency Injection с Unity (http://msdn.microsoft.com/en-us/library/ff660899(v=pandp.20).aspx) или MEF являются стандартные MVVM пути взглядов сцепных к ViewModels

Но дон Не забывайте, что MVVM - это образец, а не жесткая структура. У вас может быть однострочное подключение в коде вида:

InitializeComponent(); 
this.DataContext = new ViewModel(whatever); 
+0

Спасибо mcalex, если я это сделаю, это новая виртуальная машина, созданная для каждого элемента управления? –

+0

да с новым вызовом. почему бы сразу открыть несколько просмотров? – mcalex

+0

Нет, но они совместно используют ViewModel. например У меня есть виджет для покупки форекс, виджет для продажи форекс и глобус с форекс-дисплеями на нем все на одном холсте. –

1

Вы можете просто добавить конструкторы без параметров для UserControls

public MyUserControl() : base(new MyViewModel()) 
{} 

public MyUserControl(MyViewModel viewModel) 
{} 

Примечание: Это может нарушить несколько проектных парадигм. :)

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