首页 > 解决方案 > 将参数传递给用户控件属性时了解 DataContext

问题描述

我已经建立了一个UserControl包含一个TreeView每个节点包含一堆控件的地方。
树代码的简化版本:

<UserControl x:Class="MyTestWPF.MyTree"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:MyTestWPF"
         mc:Ignorable="d" 
         x:Name="MyTreeUserControl">
<UserControl.Resources>
    <HierarchicalDataTemplate DataType="{x:Type local:MyTreeNode}"
                          ItemsSource="{Binding Nodes}">
        <StackPanel Orientation="Horizontal">
            <ComboBox>
                <ComboBoxItem>Item 1</ComboBoxItem>
                <ComboBoxItem>Item 2</ComboBoxItem>
            </ComboBox>
            <TextBlock Text="{Binding Path=Name}" />
        </StackPanel>
    </HierarchicalDataTemplate>
</UserControl.Resources>
<TreeView ItemsSource="{Binding MyTreeProp, ElementName=MyTreeUserControl}" />
</UserControl>

控件的代码隐藏只有一个简单的使用片段创建DependencyPropertyMyTreeProp属性。propdp

然后我像这样调用控件:

<local:MyTree MyTreeModel="{Binding Path=MyData}" />

这是父视图DataContextMyData

this.DataContext = new {
    MyData = new List<MyTreeNode>() {
        new MyTreeNode() {
            Name = "1",
            Nodes = new MyTreeNode[] {
                new MyTreeNode() { Name= "2" }
            }
        }
    }
};

MyTreeNode很简单:

public class MyTreeNode
{
    public string Name { get; set; }
    public MyTreeNode[] Nodes { get; set; }
}

我的问题是关于将数据传递到MyTree控件的MyTreeProp.
我最初尝试在构造函数中设置ItemsSource不带 , 的绑定ElementName并设置MyTree's DataContextthis但这引发了异常:

System.Windows.Data Error: 40 : BindingExpression path error:
'MyData' property not found on 'object' ''MyTree' (Name='MyTreeUserControl')'. BindingExpression:Path=MyData;
DataItem='MyTree' (Name='MyTreeUserControl');
target element is 'MyTree' (Name='MyTreeUserControl');
target property is 'MyTreeProp' (type 'List`1')

为什么?

--Edit--
根据评论,我知道DataContext直接设置是错误的......但这仍然留下了一个问题 - 访问 UserControl 属性的正确方法是什么?它真的需要为UserControl标签设置一个名称,然后在我需要访问该属性时通过名称显式引用它吗?

标签: wpfxaml

解决方案


推荐阅读