MVVM - Как связать модель представления с представлением - PullRequest
0 голосов
/ 28 апреля 2011

и заранее спасибо за руководство. Я новичок в MVVM, и я учился через статьи. Я думаю, что я довольно далеко, но есть одна вещь, которая, кажется, ускользает от меня. Как я (без использования кода в коде сзади) автоматически привязываюсь к желаемому представлению? Насколько я понимаю, если все сделано правильно, это то, как шаблон должен работать. Я могу сделать все это, используя код в главном окне xaml, и я даже правильно создал словарь ресурсов (так как могу получить к нему доступ в непосредственном окне). Я просто не могу перейти к следующему шагу автоматизации. ' Это может быть мой дизайн, поскольку я новичок в этом паттерне, я полностью поддаюсь возможности того, что я все сделал неправильно. Вот что у меня есть ...

У меня есть главное окно. Это сетка с 3 рядами. Верхний ряд - это меню. Нижний ряд - строка состояния. Посередине находится панель стека, в которой содержимое динамически загружается в зависимости от выбора меню.

У меня есть 2 вида, которые я использую для заполнения этой панели стека. В одном нет ничего, кроме стилизованного текстового поля (Справка и информация). Другое само по себе является составным видом: панель поиска, таблица результатов и панель сведений загружены в фрейм менеджера док-станции.

В коде главного окна позади, когда пользователь щелкает опцию меню, я очищаю дочерние элементы панели стека, создаю экземпляр модели представления, создаю экземпляр представления, передавая модель представления, а затем добавляю новое представление в дочерние элементы. стека. Это отлично работает, но я не думаю, что это соответствует шаблону.

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

Я прочитал статьи, в которых все доступные модели представлений были добавлены в список только для чтения в модели представлений, которая, по сути, действует как переход между главной вдовой и фактическими необходимыми моделями представлений. Это выглядит нормально, но я не понимаю, зачем нужен словарь ресурсов. Более того, эти примеры были реализациями мастера, и в этом сценарии это кажется хорошим подходом, но я не могу себе представить, что это можно сделать для приложения, скажем, с 100 моделями представления.

Опять же, извините за мое невежество, но я надеялся, что кто-то может указать мне правильное направление. Как я уже сказал, я прочитал тонну статей (Джош Смит, Дейв Хилл и т. Д.), И до сих пор не установил связь, поэтому я надеялся получить какое-то конкретное руководство. (У меня есть WPF Unleashed, но я надеялся добиться некоторого прогресса до этого.)

Может кто-нибудь помочь?

Ответы [ 2 ]

3 голосов
/ 12 ноября 2015

Существуют способы привязки моделей вашего вида.

1. Создайте статический ресурс в XAML.

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
  <Window.Resources>
    <local:MainViewModel x:Key="MainVM" />
  </Window.Resources>
  <Grid DataContext="{StaticResource MainVM}">

  </Grid>
</Window>

2. Привязка в конструкторе View

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

public MainWindow()
{
  InitializeComponent();
  this.DataContext = new MainViewModel(); 
}

3. Привязка с использованием ViewModelLocator

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

Вот простой пример класса локатора viewmodel. Класс локатора viewmodel предоставляет некоторые свойства viewmodel. Затем мы свяжем эти свойства с контекстом данных представлений.

 public class ViewModelLocator
  {
    public ViewModelLocator()
    {
      this.MainVM = new MainViewModel();
      this.AnotherVM = new AnotherViewModel();
    }
    public MainViewModel MainVM { get; set; }
    public AnotherViewModel AnotherVM { get; set; }
  }

Затем вы можете создать статический ресурс локатора viewmodel в App.xaml, чтобы сделать его доступным для всех представлений в приложении.

<Application x:Class="WpfApplication2.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApplication2"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
      <local:ViewModelLocator x:Key="Locator" />         
    </Application.Resources>
</Application>

Затем вы можете привязать контекст данных вашего представления к свойству локатора viewmodel.

В примере говорится, что вы привязываете свойство MainVM, если локатор viewmodel, который является экземпляром MainViewModel, к контексту данных Window.

<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525"
        DataContext="{Binding MainVM, Source={StaticResource Locator}}">
0 голосов
/ 28 апреля 2011

Я не использовал WPF, но я использовал Silverlight, и я считаю, что он должен быть примерно таким же.

Когда я создавал свое представление, я создавал необходимую модель представления в представлении. Я использую MEF для внедрения зависимостей и создаю Обязательную виртуальную машину таким образом, вы можете не захотеть идти по этому пути, но это может дать вам представление.

например. ViewModel:

[Export] // This attribute tells MEF to export an instance of this class
public class MyViewModel
{ ... }

View

[Import] // MEF will look for any exported objects of type MyViewModel
public MyViewModel ViewModel
{
  get { return this.DataContext as MyViewModel; }
  set { this.DataContext = value; }
}

Этот способ экономит создание экземпляров вашей ВМ и вашего V, просто создайте свой V и позвольте этому позаботиться о создании экземпляров ВМ и настройке собственного DataContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...