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

时间:2016-07-05 11:38:44

标签: c# wpf data-binding datacontext

我有一个父元素的绑定。如何在绑定中提供DataContext的数据类型,因此intellisense可以解析绑定的属性?

绑定在运行时工作正常。所以,我有以下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”。 Intellisense现在将在DataContext上为两个属性加下划线(因此DeleteTabCommand和TabItems带有下划线)。

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

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

但这不会改变intellisense警告。

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

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

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

但是,这也没有摆脱警告。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

现在这种DataContext的{​​{1}}实际上是一种不同的类型,因为它是TabItem的支持对象的类型。因此,在这种情况下,intellisense无法找到TabItem地址。

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

答案 1 :(得分:0)

我需要将mc:Ignorable =“ d”属性添加到Window标记。本质上我学到了一些新东西。真正的编译器/ xaml解析器实际上会忽略/“注释掉” Expression Blend / Visual Studio设计人员认可的d:名称空间前缀!

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释放(Kindle位置1799-1811)。萨姆斯Kindle版。

标记兼容性

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

Expression Blend利用此功能来执行一些操作,例如向XAML内容添加设计时属性,这些属性可以在运行时忽略。

可以给

mc:Ignorable一个以空格分隔的名称空间列表,并且可以给mc:ProcessContent一个以空格分隔的元素列表。当XamlXmlReader遇到无法解决的可忽略内容时,它不会报告任何节点。如果可解决的内容可以解决,则将正常报告。因此,消费者无需采取任何特殊措施即可正确处理标记兼容性。