wpf - 将参数传递给用户控件属性时了解 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>
控件的代码隐藏只有一个简单的使用片段创建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
并设置MyTree
's 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 的属性,然后使用它而不需要
UserControl.Name
在每个需要读取它的元素中引用它吗?
--Edit--
根据评论,我知道DataContext
直接设置是错误的......但这仍然留下了一个问题 - 访问 UserControl 属性的正确方法是什么?它真的需要为UserControl
标签设置一个名称,然后在我需要访问该属性时通过名称显式引用它吗?
解决方案
推荐阅读
- c# - Donet 测试不会并行化测试
- python - 所有端点上的烧瓶闪存消息
- java - 如何在 AMQP declareExchanges 阶段防止 ChannelContinuationTimeoutException
- graphql - Shopify GraphQL“cartLinesAdd”API
- git - 使用新创建的远程分支更新 .git
- graphviz - Graphviz 中从左上到右下的树
- html - 当我从 Django 站点上传图像时,为什么图像不会自动调整大小
- postgresql - PostgreSQL:在数据库重新启动时,为什么启动序列号不可预测?
- regex - 正则表达式不适用于可选()?句子
- docker-compose - 在 gitlab-ci.yml 中使用来自 docker-compose 的容器