如何使用自己的DataTemplate DependencyProperty实现WPF控件?

时间:2014-04-21 22:22:08

标签: c# .net wpf xaml

我是一名中级WPF开发人员,具有如何实现依赖项属性以及简单自定义控件的工作知识。我还不知道如何将DataTemplate依赖项属性添加到自定义控件,并使用它来为数据集合中的每个数据定义元素树。

完整的故事是我一直致力于创建一个WPF地图控件,它在地图图块上显示地图上的许多不同点和几何形状。当用户“拖动”地图时,这些形状将与地图的其余部分一起转换。

我已经完成了这个,因为我创建了地图控件,并且可以在Xaml中为其添加具有地图坐标的子元素。我想更进一步,并添加数据集合的属性,即点,区域等。为了更好地理解我正在寻找的东西,我想从ListBox重新创建两个属性:ItemsSource和ItemTemplate。 / p>

我在Map控件中添加了两个依赖项属性 - PointsSource和PointsTemplate。 PointsSource的类型为IEnumberable,表示要在地图上显示的数据集合。 PointsTemplate表示每个数据应该是什么样子。简单地将这些属性抛入我的控制中显然是不够的,但我不确定如何将它们相互协调。如果任何人都有使用它自己的DataTemplate属性创建自定义数据控件的工作知识来更改每个数据元素的UI树,我真的很感激。

2 个答案:

答案 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,并将其ItemsSourceItemTemplate属性绑定到自定义依赖项属性。即,

<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;)