WPF композитный Windows и ViewModels - PullRequest
5 голосов
/ 31 мая 2011

У меня есть WPF Window, который содержит несколько UserControls, эти элементы управления содержат другой.А теперь, каков самый главный способ, как создать ViewModel для этого окна и где его связать.

Я ожидаю, что сначала нужно создать ViewModel для каждого из элементов управления.

Ответы [ 4 ]

4 голосов
/ 31 мая 2011

Есть несколько способов сделать это.

Внедрить ВМ

Я бы порекомендовал этот метод.

Если ваше окно создано в классе App, например

var window = new MyWindow();
window.Show();

Я бы назначил виртуальную машину перед отображением окна:

var window = new MyWindow();
window.DataContext = GetDataContextForWindow();
window.Show();

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

DataBind

Если вы хотите установить виртуальную машину для элемента управления, вы можете привязать свойство DataContext к экземпляру виртуальной машины, предоставленному соседней виртуальной машиной.

<Controls:MyControl DataContext={Binding MyControlsVm} />

Код позади

Вы можете установить виртуальную машину, используя метод init в коде, например

public MyWindow()
{
    InitializeComponent();
    DataContext = CreateViewModel;
}

Вы можете использовать хитрость, если вы не хотите создавать виртуальную машину для своей главной страницы:

public MyWindow()
{
    InitializeComponent();
    DataContext = this;
}

и просто используйте код класса как VM.

1 голос
/ 01 июня 2011

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

Я называю это шаблоном View Locator, я использую этот метод для создания экземпляра моего представления, поскольку я считаю, что его очень просто реализовать.

Он в основном помещает запись в ResourceDictionary вашего приложения, которая указывает WPF использовать IValueConverter для поиска и создания экземпляра View при обнаружении ViewModel.

Таким рабочим примером будет:

В вашем app.xaml:

<Application x:Class="MyApp.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="MainWindow.xaml" >
    <Application.Resources>
        <ResourceDictionary Source="Resources.xaml"/>
    </Application.Resources>
</Application>

В ресурсах. Xaml:

<DataTemplate DataType="{x:Type vm:ViewModelBase}">
    <ContentControl Content="{Binding Converter={StaticResource ViewModelConverter}}"/>
</DataTemplate>

Установите DataContext вашего окна управления, например,

public MainWindow : Window
{
  InitializeComponent();
  DataContext = new MainViewModel();
}

И ты почти закончил. Так что если у вас есть MainViewModel, например, так:

public class MainViewModel : ViewModelBase
{
  public ChildViewModel1 Child1 {get;set;}
  public ChildViewModel2 Child2 {get;set;}
}

и у вас есть UserControl, который преобразуется в MainViewModel следующим образом:

<UserControl x:Class="MainView">
  <StackPanel>
    <ContentPresenter Content="{Binding Child1}"/>
    <ContentPresenter Content="{Binding Child2}"/>
  </StackPanel>
</UserControl>

Таким образом, ваш ViewModelConverter вернет экземпляр соответствующего просмотра без каких-либо дополнительных усилий с вашей стороны.

0 голосов
/ 03 июня 2011

Возможно, вас заинтересуют примеры приложений WPF Application Framework (WAF) . Они показывают, как можно создавать экземпляры составных видов и моделей представления и как они взаимодействуют друг с другом.

0 голосов
/ 01 июня 2011

Что касается вопроса о дочерних элементах управления, почему одно из свойств модели корневого представления не будет экземпляром модели дочернего представления, который вы передадите в дочерний элемент управления? Другим вариантом будет преобразователь, который преобразует свойство, основанное на модели без представления, в экземпляр модели дочернего представления (например, шаблон адаптера).

...