绑定工作正常,但智能感知说:无法解析类型为“对象”的数据上下文中的属性 XXX

本文关键字:对象 类型 数据 XXX 属性 上下文 工作 智能 感知 绑定 | 更新日期: 2023-09-27 17:55:21

我有一个绑定到父元素。如何在绑定中提供数据上下文的数据类型,以便智能感知可以解析绑定的属性?

绑定在运行时工作正常。因此,我有以下 XAML 结构:

<TabControl Name="TabDynamic" 
            ItemsSource="{Binding TabItems, Mode=OneWay}" ...>
    <TabControl.Resources>
        <DataTemplate x:Key="TabHeader" DataType="TabItem">
            <DockPanel>
                <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=Header}" />
                <Button Command="{Binding ElementName=TabDynamic, Path=DataContext.DeleteTabCommand}"
                        CommandParameter="{Binding ElementName=TabDynamic, Path=DataContext.TabItems/}">
                    <Image Source="{DynamicResource DeleteImg}" Height="11" Width="11"></Image>
                </Button>
            </DockPanel>
        </DataTemplate>
        <DataTemplate x:Key="TabContent" DataType="viewModels:ConnectionInfoVM">
            <views:BufferViewerControl/>
        </DataTemplate>
    </TabControl.Resources>
</TabControl>

DataContext 的数据类型是"viewModels:ConnectionInfoVM"。智能感知现在将在 DataContext 上为这两个属性添加下划线(因此 DeleteTabCommand 和 TabItems 带有下划线)。

我已经尝试在Button元素中使用设计时数据上下文定义"d:DataContext",如下所示:

d:DataContext="{d:DesignInstance viewModels:ConnectionInfosVM}"

但这并不能改变智能感知警告。

我还尝试将DataTemplate上的DataType定义为"viewModels:ConnectionInfosVM",就像我对内容模板所做的那样,但这也不会改变智能感知警告(我想是错误的,因为元素的数据类型确实是TabItem)。

另一种尝试是通过向Button元素定义添加以下内容来定义 DataContext:

<Button.DataContext>
    <viewModels:ConnectionInfosVM/>
</Button.DataContext>

但这也不能摆脱警告。

绑定工作正常,但智能感知说:无法解析类型为“对象”的数据上下文中的属性 XXX

我至少为上述问题找到了解决方案。我在代码隐藏中设置了有问题的窗口的DataContext。我示例中的TabControl只是继承了该 DataContext,即 ConnectionInfosVM。

为了修复这些警告(当然,为了获得通过定位器提供DataContext的灵活性),我在 XAML 中定义了如下所示的DataContext

<UserControl ...
             DataContext="{Binding Source={StaticResource mainViewModelLocator}, Path=ConnectionInfosVM}">

似乎智能感知现在能够解决这些引用。但另一方面,我也将DataTemplate中包含的TextBlock更改为以下内容:

 <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=DataContext.Address}" />

现在,这种TabItemDataContext实际上是一种不同的类型,因为它是TabItem的支持对象的类型。因此,在这种情况下,智能感知无法找到Property地址。

那么,问题仍然存在,是否有可能在DataTemplate中定义的绑定中定义DataContext的类型?

我需要将mc:Ignorable="d"属性添加到Window标签中。基本上我学到了一些新东西。Expression Blend/Visual Studio 设计器承认的 d: 命名空间前缀实际上被真正的编译器/xaml 解析器忽略/"注释掉"了!

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

以下内容摘自

内森, 亚当 (2010-06-04).WPF 4 Unleashed(Kindle Locations 1799-1811)。山姆。点燃版。

标记兼容性

标记兼容性 XML 命名空间(http://schemas.openxmlformats.org/markup-compatibility/2006,通常与 mc 前缀一起使用)包含一个 Ignorable 属性,该属性指示 XAML 处理器在无法解析为其 .NET 类型/成员时忽略指定命名空间中的所有元素/属性。(命名空间还具有一个 ProcessContent 属性,该属性覆盖被忽略命名空间内特定类型的"可忽略"。

表达式混合利用此功能执行诸如向 XAML 内容添加可在运行时忽略的设计时属性之类的操作。

mc:Ignorable 可以给出一个以空格分隔的命名空间列表,mc:ProcessContent 可以给出一个以空格分隔的元素列表。当 XamlXmlReader 遇到无法解析的可忽略内容时,它不会报告它的任何节点。如果可忽略的内容可以解析,则会正常上报。因此,使用者无需执行任何特殊操作即可正确处理标记兼容性。