Я создаю wpf пользовательский элемент управления, который находится в mvvm шаблоне. Таким образом, мы имеем: представление (без кода в codebehind файле), viewmodel, модель, dataaccess файлы.
У меня есть MainWindow.xaml как файл представления, который я должен связать с MainWindowModel.cs.
Обычно, в wpf приложение мы можем сделать это с onStartUp событием в файле App.xaml. Но в пользовательском элементе управления, поскольку у нас нет App.xaml... Как я достигаю его?
Помогите :(... Заранее спасибо!!!
Вы можете использовать ContentControl
с DataTemplate
для привязки UserControl
(View) к ViewModel:
<DataTemplate DataType="{x:Type vm:MyViewModel}">
<v:MyUserControl />
</DataTemplate>
...
<ContentControl Content="{Binding Current}" />
WPF автоматически выберет DataTemplate
в зависимости от типа Content
Существует бесконечное множество способов сделать это, которые все попадают в одну из двух категорий: "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-фреймворки и увидеть, как они это делают.
Я использовал 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 могут работать с любым классом.
Мы можем использовать ObjectDataProvider для вызова метода внутри объекта .. следующим образом:
<ObjectDataProvider ObjectType="{x:Type local:TemperatureScale}"
MethodName="ConvertTemp"
x:Key="convertTemp">
Is в любом случае сделать то же самое с помощью DataTemplate