如何使用DataContext属性在XAML中的窗口上设置ViewModel?

时间:2011-01-04 03:43:12

标签: .net wpf xaml mvvm

这个问题几乎说明了一切。

我有一个窗口,并尝试使用完整命名空间将DataContext设置为ViewModel,但我似乎做错了。

<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="BuildAssistantUI.ViewModels.MainViewModel">

5 个答案:

答案 0 :(得分:131)

试试这个。

<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:VM="clr-namespace:BuildAssistantUI.ViewModels">
    <Window.DataContext>
        <VM:MainViewModel />
    </Window.DataContext>
</Window>

答案 1 :(得分:105)

除了其他人提供的解决方案(好的,正确的)之外,还有一种方法可以在XAML中指定ViewModel,但仍然将特定的ViewModel与View分开。当你想编写孤立的测试用例时,将它们分开是很有用的。

在App.xaml中:

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

在MainWindow.xaml:

<Window x:Class="BuildAssistantUI.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    DataContext="{StaticResource MainViewModel}"
    />

答案 2 :(得分:9)

您需要实例化MainViewModel并将其设置为datacontext。在您的语句中,它只是将其视为字符串值。

     <Window x:Class="BuildAssistantUI.BuildAssistantWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:BuildAssistantUI.ViewModels">
      <Window.DataContext>
        <local:MainViewModel/>
      </Window.DataContext>

答案 3 :(得分:3)

您可能想尝试Catel。它允许您定义DataWindow类(而不是Window),该类自动为您创建视图模型。这样,您可以像在原始帖子中那样使用ViewModel的声明,并且仍将创建视图模型并将其设置为DataContext。

有关示例,请参阅this article

答案 4 :(得分:3)

还有这种指定视图模型的方式:

using Wpf = System.Windows;

public partial class App : Wpf.Application //your skeleton app already has this.
{
    protected override void OnStartup( Wpf.StartupEventArgs e ) //you need to add this.
    {
        base.OnStartup( e );
        MainWindow = new MainView();
        MainWindow.DataContext = new MainViewModel( e.Args );
        MainWindow.Show();
    }
}

先前提出的所有解决方案都要求MainViewModel必须具有无参数构造函数。

Microsoft认为可以使用无参数构造函数来构建系统。如果您也对此印象深刻,请继续使用其他一些解决方案。

对于那些知道构造函数必须具有参数的对象,因此对象的实例化不能留在魔术框架的手中,指定视图模型的正确方法是上面显示的方法。