我建立了一个包含UserControl
的{{1}},其中每个节点都包含一堆控件。
树的代码的简化版本:
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>
代码段创建的DependencyProperty
属性,该控件的代码仅包含一个简单的MyTreeProp
。
然后我像这样调用控件:
propdp
这是父视图的<local:MyTree MyTreeModel="{Binding Path=MyData}" />
和DataContext
:
MyData
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
的{{1}}设置为MyTree
,但这引发了例外:
DataContext
为什么?
this
,我有什么误解?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')
?还是我看错了?DataContext
的情况下使用它吗? -编辑-
根据评论,我知道直接设置MyData
是错误的……但是,仍然存在问题-访问UserControl属性的正确方法是什么?确实需要在UserControl.Name
标签上设置一个名称,然后在需要访问该属性时通过名称显式引用它吗?