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

kqqjbcuj  于 2023-01-06  发布在  其他
关注(0)|答案(5)|浏览(259)

这个问题几乎说明了一切。
我有一个窗口,并尝试使用ViewModel的完整命名空间设置DataContext,但我似乎做错了什么。

<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">
pw9qyyiw

pw9qyyiw1#

试试这个。

<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>
jum4pzuy

jum4pzuy2#

除了其他人提供的解决方案(很好,也很正确)之外,还有一种方法可以在XAML中指定ViewModel,但仍然将特定的ViewModel与视图分离。当您希望编写独立的测试用例时,将它们分离是很有用的。
在应用程序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>

在主窗口.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}"
    />
dtcbnfnu

dtcbnfnu3#

你需要示例化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>
kxxlusnw

kxxlusnw4#

还有一种更好的指定视图模型的方法:

using Wpf = System.Windows;

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

上述机制仅适用于主视图模型。为了解决下面询问用户控件的问题,该机制对子视图模型的解释如下:

public class ParentViewModel
{
    public MyChildViewModel ChildViewModel { get; }

    public ParentViewModel()
    {
        ChildViewModel = new MyChildViewModel( ... );
    }
}

ParentView.xaml:

[...]
xmlns:local="clr-namespace:the-namespace-of-my-wpf-stuff"
[...]
    <local:MyChildView DataContext="{Binding ChildViewModel}" />
[...]

<Rant>之前提出的所有解决方案都要求视图模型具有无参数构造函数。微软的印象是系统可以使用无参数构造函数来构建。如果你也有这种印象,请务必继续使用其他一些解决方案。对于那些理解构造函数必须具有参数的人,因此对象的示例化不能留给魔术框架来处理,指定视图模型的正确方法是我上面展示的方法。</Rant>

rdrgkggo

rdrgkggo5#

你可能想试试Catel。它允许你定义一个DataWindow类(而不是Window),这个类会自动为你创建视图模型。这样,你就可以像在你最初的帖子中那样使用ViewModel的声明,视图模型仍然会被创建和设置为DataContext。
请参阅本文中的示例。

相关问题