我可以看到两种方法将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;
}
}
}
答案 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模式的测试的复杂性非常有用。