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

pta*_*air 6 c# data-binding wpf 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>
Run Code Online (Sandbox Code Playgroud)

DataContext的数据类型是"viewModels:ConnectionInfoVM".Intellisense现在将为DataContext上的两个属性加下划线(因此DeleteTabCommand和TabItems带有下划线).

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

d:DataContext="{d:DesignInstance viewModels:ConnectionInfosVM}"
Run Code Online (Sandbox Code Playgroud)

但这不会改变intellisense警告.

我也尝试将DataTemplate上的DataType定义为"viewModels:ConnectionInfosVM",就像我对内容模板所做的那样,但这也不会改变intellisense警告(我猜错了,因为它的数据类型是元素真的是一个TabItem).

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

<Button.DataContext>
    <viewModels:ConnectionInfosVM/>
</Button.DataContext>
Run Code Online (Sandbox Code Playgroud)

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

pta*_*air 2

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

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

<UserControl ...
             DataContext="{Binding Source={StaticResource mainViewModelLocator}, Path=ConnectionInfosVM}">
Run Code Online (Sandbox Code Playgroud)

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

 <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=DataContext.Address}" />
Run Code Online (Sandbox Code Playgroud)

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

因此,问题依然存在,是否有可能DataContext在 a 中定义的绑定内定义 the 的类型DataTemplate