Подключение ViewModel к представлению в Silverlight - PullRequest
5 голосов
/ 11 июня 2009

Я вижу два способа подключения ViewModel к View. Один в XAML, а другой через внедрение зависимостей в коде позади.

Какой метод более предпочтителен? Я предпочитаю метод xaml, потому что вообще не хочу никакого кода в коде, но есть ли проблемы с одним над другим?

<navigation:Page x:Class="MyNamespace.MyViewModel" 
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
   xmlns:ViewModel="clr-namespace:MyNameSpace.MyViewModel"
   xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
   Title="ViewModel Page" >

    <navigation:Page.Resources>
        <ViewModel:MyViewModel x:Key="ViewModel"></ViewModel:MyViewModel>
    </navigation:Page.Resources>

    <Grid x:Name="LayoutRoot" Background="White" 
          DataContext="{StaticResource ViewModel}">

    </Grid>
</navigation:Page>

OR

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;

namespace MyNamespace
{
    public partial class MyView : Page
    {
        public MyView()
        {
            InitializeComponent(MyViewModel viewModel);

            this.DataContext = viewModel;
        }
    }
}

Ответы [ 4 ]

4 голосов
/ 18 июля 2009

Я использую класс, который я дублирую, «Экран», который обрабатывает триаду MVVM. Я начал с того, что V вводили в виртуальную машину, затем виртуальную машину в качестве ресурса в виртуальной памяти, но в итоге концепция Screen работала для меня лучше всего. Это позволяет мне использовать V и VM без связи друг с другом. Это также отвлекает другие функциональные возможности в моей общей структуре представления. Вот пример конструктора для моего класса Screen:

    public CatalogItemScreen(IUnityContainer container) : base(container)
    {
        this.ViewModel = Container.Resolve<ICatalogItemViewModel>();
        this.View = Container.Resolve<CatalogItemView>();
        this.View.DataContext = this.ViewModel;
    }

Обратите внимание, что VM создается на экране, здесь создается V, а 2 связаны друг с другом. В этом примере используются Unity и Prism, но для этого нет необходимости.

3 голосов
/ 11 июня 2009

Шон имеет хороший пост View или ViewModel первым. Наличие виртуальной машины в XAML дает вам возможность смешивания (см. Пример данных в Blend), что круто, но цена вынуждена выталкивать информацию обратно в представление. По этой причине Джон Папа отошел от этого подхода.

Я использую идею брака Шона (см. Ссылку выше).

НТН -Erik

0 голосов
/ 11 июня 2009

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

public partial class Page : UserControl
{
    private PageViewModel _viewModel = new PageViewModel();

    public PageViewModel ViewModel
    {
        get { return _viewModel; }
        set { _viewModel = value; }
    } 

    public Page()
    {
        InitializeComponent();
        this.Loaded += new RoutedEventHandler(Page_Loaded);
    }

    void Page_Loaded(object sender, RoutedEventArgs e)
    {
        this.DataContext = ViewModel;
    }

}

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

http://silverlight.net/blogs/justinangel/archive/2009/02/25/silverlight-unit-testing-rhinomocks-unity-and-resharper.aspx

0 голосов
/ 11 июня 2009

Как у вас здесь, я бы пошел с XAML. Есть и другие способы установить свойство DataContext. Если вам интересно, посмотрите на Microsoft CAG framework для WPF.

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