как загрузить wpf usercontrol в шаблоне MVVM

Я создаю wpf пользовательский элемент управления, который находится в mvvm шаблоне. Таким образом, мы имеем: представление (без кода в codebehind файле), viewmodel, модель, dataaccess файлы.

У меня есть MainWindow.xaml как файл представления, который я должен связать с MainWindowModel.cs.

Обычно, в wpf приложение мы можем сделать это с onStartUp событием в файле App.xaml. Но в пользовательском элементе управления, поскольку у нас нет App.xaml... Как я достигаю его?

Помогите :(... Заранее спасибо!!!

6
задан Relativity 20 May 2010 в 08:40
поделиться

4 ответа

Вы можете использовать ContentControl с DataTemplate для привязки UserControl (View) к ViewModel:

<DataTemplate DataType="{x:Type vm:MyViewModel}">
    <v:MyUserControl />
</DataTemplate>

...

<ContentControl Content="{Binding Current}" />

WPF автоматически выберет DataTemplate в зависимости от типа Content

16
ответ дан 8 December 2019 в 04:28
поделиться

Существует бесконечное множество способов сделать это, которые все попадают в одну из двух категорий: "view first" или "model first".

В режиме "сначала вид" сначала создается вид (например, ваше главное окно), а затем (например, в codebehind) вид инстанцирует ViewModel и устанавливает ее как свой datacontext):

private void WindowLoaded(object sender, EventArgs args)
{
   this.DataContext = ViewModelService.GetViewModelX();
}

В режиме "сначала модель" сначала создается ViewModel, а затем инстанцируется вид.

// method of the viewmodel 
public void LoadView()
{
     // in this example the view abstracted using an interface
     this.View = ViewService.GetViewX();
     this.View.SetDataContext(this);
     this.View.Show();    
}

Приведенные здесь примеры - это лишь один из многих способов. Вы можете посмотреть на различные MVVM-фреймворки и увидеть, как они это делают.

2
ответ дан 8 December 2019 в 04:28
поделиться

Я использовал MVVM Light Toolkit , в котором есть класс ViewModelLocator, в который вы можете добавлять свойства для моделей просмотра. Затем вы создаете ссылку на ViewModelLocator в своем Mainwindow.xaml следующим образом:

<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True"/>

На панели сетки или в другом месте, которое вы используете, затем вы можете установить текст данных следующим образом:

<Grid DataContext="{Binding MainWindowViewModel, Source={StaticResource Locator}}">
...
</Grid>

Вы также можете использовать MEFedMVVM , который потенциально добавляет немного больше гибкости с точки зрения возможности замены различных реализаций viewModel в представлении.

Гибкость обеих этих библиотек заключается в том, что вам не нужно использовать их базовые классы ViewModel, если вы не хотите - ViewModelLocator и MEFedMVVM могут работать с любым классом.

2
ответ дан 8 December 2019 в 04:28
поделиться

Мы можем использовать ObjectDataProvider для вызова метода внутри объекта .. следующим образом:

<ObjectDataProvider ObjectType="{x:Type local:TemperatureScale}"
                    MethodName="ConvertTemp" 
                    x:Key="convertTemp">

Is в любом случае сделать то же самое с помощью DataTemplate

0
ответ дан 8 December 2019 в 04:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: