将ViewModel连接到Silverlight中的视图

时间:2009-06-11 17:26:54

标签: c# silverlight mvvm

我可以看到两种方法将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>

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 个答案:

答案 0 :(得分:4)

我使用一个类我配置一个处理MVVM三元组的“屏幕”。我开始说,一个V注入一个虚拟机,然后一个虚拟机作为一个资源在V中,但最终屏幕概念最适合我。它允许我使用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,但没有必要实现此目的。

答案 1 :(得分:3)

Shawn首先在View or ViewModel发表了一篇好文章。在XAML中使用VM为您提供Blendability(在Blend中查看示例数据)这很酷,但是价格必须将信息推回​​到View中。由于这个原因,约翰帕帕已经摆脱了这种方法。

我正在使用肖恩的婚姻想法(见上面的链接)。

HTH -Erik

答案 2 :(得分:0)

你在这里的方式,我会选择XAML。还有其他方法可以设置DataContext属性。如果您有兴趣,请查看WPF的Microsoft CAG框架。

答案 3 :(得分:0)

我在代码中设置了VM,因为这样可以更轻松地对View进行测试。 Justin Angel有一个很棒的帖子:

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