将参数传递给用户控件属性时了解DataContext

时间:2019-07-16 09:24:37

标签: wpf xaml

我建立了一个包含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,我有什么误解?
  • 为什么从错误中似乎正在UserControl上搜索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') ?还是我看错了?
  • 真的没有办法将值传递给UserControl的属性,然后在不需要读取每个需要读取的每个元素中引用DataContext的情况下使用它吗?

-编辑-
根据评论,我知道直接设置MyData是错误的……但是,仍然存在问题-访问UserControl属性的正确方法是什么?确实需要在UserControl.Name标签上设置一个名称,然后在需要访问该属性时通过名称显式引用它吗?

0 个答案:

没有答案