首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定工作正常,但intellisense显示:无法在类型为“object”的数据上下文中解析属性XXX

绑定工作正常,但intellisense显示:无法在类型为“object”的数据上下文中解析属性XXX
EN

Stack Overflow用户
提问于 2016-07-05 19:38:44
回答 2查看 3.1K关注 0票数 10

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

绑定在运行时运行良好。因此,我有以下XAML结构:

代码语言:javascript
复制
<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“,如下所示:

代码语言:javascript
复制
d:DataContext="{d:DesignInstance viewModels:ConnectionInfosVM}"

但这不会更改intellisense警告。

我还试图将DataTemplate上的DataType定义为"viewModels:ConnectionInfosVM",就像我对content-template所做的那样,但这也不会改变智能感知警告(我猜这是错误的,因为元素的数据类型实际上是TabItem)。

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

代码语言:javascript
复制
<Button.DataContext>
    <viewModels:ConnectionInfosVM/>
</Button.DataContext>

但这也不能摆脱警告。

EN

回答 2

Stack Overflow用户

发布于 2018-08-04 20:30:55

我需要将mc:Ignorable="d“属性添加到窗口标记中。基本上,我学到了一些新东西。表达式Blend/Visual Studio designer承认的d: namespace前缀实际上被真正的编译器/xaml解析器忽略/“注释掉”了!

代码语言:javascript
复制
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

以下内容摘自

Nathan,Adam (2010-06-04)。释放WPF 4 (Kindle位置1799-1811)。萨姆斯。Kindle版。

标记兼容性

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

Expression Blend利用此功能向XAML内容添加可以在运行时忽略的设计时属性。

可以为mc:Ignorable提供一个以空格分隔的名称空间列表,为mc:ProcessContent提供一个以空格分隔的元素列表。当XamlXmlReader遇到无法解析的可忽略内容时,它不会为其报告任何节点。如果可以解析可忽略的内容,则正常上报。所以消费者不需要做任何特殊的事情来正确地处理标记兼容性。

票数 2
EN

Stack Overflow用户

发布于 2016-07-06 22:32:16

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

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

代码语言:javascript
复制
<UserControl ...
             DataContext="{Binding Source={StaticResource mainViewModelLocator}, Path=ConnectionInfosVM}">

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

代码语言:javascript
复制
 <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=DataContext.Address}" />

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

因此,问题仍然存在,是否可以在DataTemplate中定义的绑定中定义DataContext的类型

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38202503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档