不能绑定到数据上下文之外的属性
本文关键字:属性 上下文 绑定 数据 不能 | 更新日期: 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