无法绑定到数据上下文之外的属性

时间:2014-06-13 07:28:52

标签: c# wpf mvvm

在我的应用程序中,我有两个绑定到相同数据的 TreeView 对象。 我为Tree创建了一个名为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类的类型...) 在主窗口中,它在“MyApp.ViewModels.TreeViewModel”类型的数据上下文中显示“无法解析属性”Name1“。 我尝试了各种不同的选项,并在StackOverFlow中阅读了一些帖子,但找不到解决方案..

感谢您的帮助。

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

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

1 个答案:

答案 0 :(得分:0)

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

您可以在大多数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