Content 和 DataContext 可以通过 Binding 同时工作吗?

问题描述 投票:0回答:1

我正在使用 (MainViewModel.cs) 中的类属性在运行时在 MainView.xaml 页面中加载视图和 ViewModel。

如果我仅绑定

Content
,视图会加载,但我使用 Binding 绑定视图和 ViewModel,则页面不会显示任何内容。

这是我的代码

这是我的主视图

<UserControl 
    x:Class="namespace.MainView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:namespace"
    d:DataContext="{d:DesignInstance Type=local:MainViewModel, IsDesignTimeCreatable=False}"
    mc:Ignorable="d" \>

    <TabControl 
        TabStripPlacement="Top"
        HorizontalAlignment="Stretch"
        VerticalAlignment="Stretch"
        SelectedIndex="0"\>

        <TabItem 
            Header="Base" 
            Content="{Binding BaseModuleView}" 
            DataContext="{Binding BaseModuleViewModel}" />

    </TabControl\>
</UserControl\>
  • 我尝试仅绑定视图(
    Content="{Binding BaseView}"
    )然后它就可以工作了
  • 我尝试仅绑定 ViewModel (
    DataContext="{Binding BaseViewModel}"
    ) 它有效

但是如果对

Contet
DataContext
都使用 Binding 则不起作用。

如果您有任何想法或建议让我尝试,那将会很有帮助

wpf mvvm data-binding
1个回答
0
投票

任何未显式指定源对象的 Binding 都使用当前 DataContext 作为其源。所以当你设置

DataContext="{Binding BaseModuleViewModel}"

BaseViewModel
应该是 current DataContext 的属性,然后将其更改为该属性的值,因此您将获得一个 new DataContext。应该清楚的是,这也有影响

Content="{Binding BaseModuleView}"

因为

BaseModuleView
也应该是当前 DataContext 的属性。


除此之外,您似乎有这样的印象:ContentControl 的

Content
必须保存视图引用,而
DataContext
保存对视图模型的引用。这是一种误解。在典型的 WPF 应用程序中,视图由应用于 ContentControls 或 ContentPresenters 的 DataTemplates 创建。当这些 DataTemplate 的 DataType 与分配给
Content
属性的视图模型类型匹配时,可以自动应用这些 DataTemplate。

有关更多信息,请参阅数据模板概述

© www.soinside.com 2019 - 2024. All rights reserved.