我是一名中级WPF开发人员,具有如何实现依赖项属性以及简单自定义控件的工作知识。我还不知道如何将DataTemplate依赖项属性添加到自定义控件,并使用它来为数据集合中的每个数据定义元素树。
完整的故事是我一直致力于创建一个WPF地图控件,它在地图图块上显示地图上的许多不同点和几何形状。当用户“拖动”地图时,这些形状将与地图的其余部分一起转换。
我已经完成了这个,因为我创建了地图控件,并且可以在Xaml中为其添加具有地图坐标的子元素。我想更进一步,并添加数据集合的属性,即点,区域等。为了更好地理解我正在寻找的东西,我想从ListBox重新创建两个属性:ItemsSource和ItemTemplate。 / p>
我在Map控件中添加了两个依赖项属性 - PointsSource和PointsTemplate。 PointsSource的类型为IEnumberable,表示要在地图上显示的数据集合。 PointsTemplate表示每个数据应该是什么样子。简单地将这些属性抛入我的控制中显然是不够的,但我不确定如何将它们相互协调。如果任何人都有使用它自己的DataTemplate属性创建自定义数据控件的工作知识来更改每个数据元素的UI树,我真的很感激。
答案 0 :(得分:2)
我在DataTemplate本身找到了我要找的东西。 DataTemplate为后面的代码提供了一个名为LoadContent()的函数。 LoadContent生成一个依赖项对象,该对象表示给定数据的内容树。根据我在其他地方发现的内容,LoadContent的常见用法可能如下所示:
foreach (object point in PointsSource)
{
FrameworkElement pointElement = _PointsTemplate.LoadContent() as FrameworkElement;
pointElement.DataContext = point;
this.Children.Add(pointElement);
}
上面的代码将为每个数据元素添加一个内容树,我们为它提供了将其DataContext绑定到的基准。
答案 1 :(得分:1)
如果有人知道使用自己的DataTemplate属性创建自定义数据控件来更改每个数据元素的UI树,我真的很感激。
基本上,您需要在控件模板中使用ItemsControl
,并将其ItemsSource
和ItemTemplate
属性绑定到自定义依赖项属性。即,
<Style TargetType="{x:Type local:CustomControl}">
<Setter Property="Template">
<ControlTemplate TargetType="{x:Type local:CustomControl}">
<ItemsControl ItemsSource="{TemplateBinding PointsSource}"
ItemTemplate="{TemplateBinding PointsTemplate}"
/>
</ControlTemplate>
</Setter>
</Style>
(假设DPs IEnumerable - &#34; PointsSource&#34;和DataTemplate - &#34; PointsTemplate&#34;)