这个问题几乎说明了一切。
我有一个窗口,并尝试使用完整命名空间将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">
答案 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认为可以使用无参数构造函数来构建系统。如果您也对此印象深刻,请继续使用其他一些解决方案。
对于那些知道构造函数必须具有参数的对象,因此对象的实例化不能留在魔术框架的手中,指定视图模型的正确方法是上面显示的方法。