将 WPF xaml 绑定到 ViewModel 而不构造它

Posted

技术标签:

【中文标题】将 WPF xaml 绑定到 ViewModel 而不构造它【英文标题】:Binding WPF xaml to a ViewModel without constructing it 【发布时间】:2016-12-12 19:43:56 【问题描述】:

我的 WPF 应用程序不使用 app.xaml。我正在使用 MVVM,并分别构建视图和视图模型。然后我将 ViewModel 传递给 View 构造函数并在那里设置数据上下文。

我希望 Visual Studio 能够理解视图模型的属性以进行上下文单击等,但在设置视图时不让它构造自己的 DataContext。

当我这样做时,它会强制我为 MainViewModel 提供一个默认构造函数,然后在我构造视图时调用该 VM 构造函数。

<Window x:Class="Kraken.CopFeed.Windows.MainFeedView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:Windows="clr-namespace:MyProgram.MainApp.WpfWindows"
        mc:Ignorable="d"
        Title="Main App" Height="321.557" Width="652.922">

    <Window.DataContext>
        <Windows:MainViewModel />
    </Window.DataContext>

如何保持现有的分别构建 V 和 VM 的实现,但让 Visual STudio 中的 XAML 编辑器知道我的 ViewModel(最终)将被设置为数据上下文?

【问题讨论】:

我认为你可以用d:DesignInstance***.com/questions/8303803/…来做到这一点 该死的,designInstance 做到了。你能补充一下答案吗? 【参考方案1】:

我认为您应该可以使用d:DesignInstance 来执行此操作,就像在this question 中一样。

<Window
    ...etc...
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    mc:Ignorable="d"

    d:DataContext="d:DesignInstance Type=MyViewModelNamespace:MyViewModel"
    >

【讨论】:

IsDesignTimeCreatable 是否必要?我没有设置它,它似乎工作正常。我引用的是具体的 ViewModel,而不是接口。找不到有关 IsDesignTimeCreatable 功能的确切信息。 我只是把它包括在内,因为完整地粘贴整个东西比测试它更容易。如果没有它对你来说也能正常工作,我会删除它。 IsDesignTimeCreatable 不是智能感知所必需的,仅当您想在图形设计器中查看数据时才需要。

以上是关于将 WPF xaml 绑定到 ViewModel 而不构造它的主要内容,如果未能解决你的问题,请参考以下文章

将事件绑定到 ViewModel

如何在 WPF 中使用多个 ViewModel 并通过一个 MainViewModel 绑定它们?

WPF 自定义一个控件,当点击按钮是触发到ViewModel(业务逻辑部分)和Xaml路由事件(页面逻辑部分)

为啥我的组合框无法绑定到 ViewModel 中的 List<string>? WPF

WPF 将窗口标题绑定到 ViewModel 属性

Prism MVVM:“没有为类型定义无参数构造函数”将 ViewModel 绑定到 View 时出错