不能绑定到数据上下文之外的属性

本文关键字:属性 上下文 绑定 数据 不能 | 更新日期: 2023-09-27 18:08:22

在我的应用程序中,我有两个TreeView对象绑定到相同的数据。我为树创建了一个名为TreeView的用户控件,它看起来像这样:

<UserControl x:Class="MyApp.Views.TreeControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:model="clr-namespace:MyApp.Model"
    xmlns:viewModel="clr-namespace:MyApp.ViewModels"
    xmlns:views="clr-namespace:MyApp.Views"
    xmlns:converters="clr-namespace:MyApp.Converters">
<UserControl.Resources>
    <converters:EnumToPicConverter x:Key="Converter"></converters:EnumToPicConverter>
    <!--Control colors.-->
    <Style x:Key="MyTreeViewItemStyle" TargetType="TreeViewItem">
        <Setter Property="IsExpanded" Value="{Binding Path=(model:TreeNode.IsExpanded), Mode=TwoWay}" />
    </Style>
    <HierarchicalDataTemplate DataType="{x:Type model:TreeNode}" ItemsSource="{Binding ChildListNodes}">
        <HierarchicalDataTemplate.Triggers>
            <DataTrigger Binding="{Binding IsEqual}" Value="false">
             <Setter  Property="TreeViewItem.Background" Value="Blue"></Setter>
            </DataTrigger>
        </HierarchicalDataTemplate.Triggers>
        <StackPanel Orientation="Horizontal">
            <Image Source="{Binding Path=EntityType,Converter={StaticResource Converter}}" />
            <TextBlock Margin="5,0" Text="{Binding ItemName, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"/>
        </StackPanel>
    </HierarchicalDataTemplate>
</UserControl.Resources>
<TreeView ItemsSource="{Binding RootNode}" ItemContainerStyle="{StaticResource MyTreeViewItemStyle}" />

现在,在我的主窗口中,我以以下方式使用它:

<Window x:Class="MyApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:model="clr-namespace:MyApp.Model"
    xmlns:viewModel="clr-namespace:MyApp.ViewModels"
    xmlns:views="clr-namespace:MyApp.Views"
    xmlns:converters="clr-namespace:MyApp.Converters"
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
    <viewModel:TreeViewModel/>
</Window.DataContext>
<DockPanel>
    <Grid DockPanel.Dock="Top" Name="LoadRow">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>
        <views:DbChooser Path="{Binding Path1}" ReloadCommand="{Binding LoadFileACommand}"  Grid.Column="0"/>
        <views:DbChooser Path="{Binding Path2}" ReloadCommand="{Binding LoadFileBCommand}"  Grid.Column="1"/>
    </Grid>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>
        <views:TreeControl  Grid.Column="0" ItemName="{Binding Name1}"/>
        <views:TreeControl  Grid.Column="1" ItemName="{Binding Name2}"/>
    </Grid>
</DockPanel>

问题是:DataContext是"viewModel:TreeViewModel",但我想将每个treeViewItem的Textblock内容绑定到"model:TreeNode"的不同属性(这是TreeNodeItem持有的类的类型..)在主窗口它说"不能解析属性"Name1"在myapp。viewmodels类型的数据上下文中。TreeViewModel"。我尝试了各种不同的选择,并在StackOverFlow中阅读了一些帖子,但找不到解决方案。

谢谢你的帮助。

编辑,一些澄清:
1. TreeControl只是包装了WPF TreeView(你可以看到代码被粘贴…)
2. 主窗口的DataContext是TreeViewModel,它是一个类,持有树的根节点(类型为TreeNode)和我使用的其他一些属性。我想"发送"到TreeControl的属性是TreeNode类型的属性,它是TreeViewItems的类型

另一个编辑:换句话说,我想要完成的是:要"告诉"第一个TreeControl"请在每个TreeNodeItem的文本块中放入属性'Name1'的内容"然后告诉第二个TreeControl "请在每个TreeNodeItem的文本块中放入属性'Name2'的内容"

不能绑定到数据上下文之外的属性

我不想回答,但可能会给你一些调试的提示。

你可以在大多数xaml标签上使用"DataContextChanged"事件来确保你得到你期望的DataContext。

如果你有预期的DataContext,但在xaml中得到警告。您可以使用:

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

并设置:

<AnyTagThatHasDataContext d:DataContext="{d:DesignInstance Type=youDataContextObject}">
这将有助于设计你的窗口/UserControl