在UserControl中实现DataTemplate DependencyProperty

时间:2011-09-23 13:13:01

标签: silverlight user-controls datatemplate dependency-properties

我正在尝试使用Expression Blend 4在Silverlight 4中的UserControl中创建一个intertia touch滚动列表。我已经在我的UserControl中创建了依赖项属性,我想像ListBox那样工作。 ItemSource是我想在列表中显示的对象列表,datatemplate是它应该显示的方式。

如何在UserControl中处理这些属性?我有一个StackPanel,其中应添加所有数据窗口,显示数据ofc。

当循环通过ItemSource将它们添加到列表(StackPanel)时,如何将我的IEnumerable中的数据应用于DataTemplate。

        public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(InertiaScrollBox), null); 
    public IEnumerable ItemsSource
    {
        get{ return (IEnumerable)GetValue(ItemsSourceProperty); }
        set{ SetValue(ItemsSourceProperty, value); }
    }

    public static readonly DependencyProperty ItemTemplateProperty = DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(InertiaScrollBox), null);
    public DataTemplate ItemTemplate
    {
        get { return (DataTemplate)GetValue(ItemTemplateProperty); }
        set { SetValue(ItemTemplateProperty, value); }
    }

这有点难以解释,但希望你能理解,否则请问。提前致谢

1 个答案:

答案 0 :(得分:1)

如果不处理更改,依赖属性就没用了。 首先,您应该添加PropertyChanged回调。在我的示例中,我将它们内联添加并调用UpdateItems私有方法。

public static readonly DependencyProperty ItemsSourceProperty =
DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(InertiaScrollBox), 
    new PropertyMetadata((s, e) => ((InertiaScrollBox)s).UpdateItems()));

public static readonly DependencyProperty ItemTemplateProperty = 
DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(InertiaScrollBox), 
    new PropertyMetadata((s, e) => ((InertiaScrollBox)s).UpdateItems()));

然后,您可以调用LoadContent类的DataTemplate方法,并将ItemsSource中的项目作为DataContext设置为返回的可视元素:

private void UpdateItems()
{
    //Actually it is possible to use only the ItemsSource property,
    //but I would rather wait until both properties are set
    if(this.ItemsSource == null || this.ItemTemplate == null)
        return;

    foreach (var item in this.ItemsSource)
    {
        var visualItem = this.ItemTemplate.LoadContent() as FrameworkElement;
        if(visualItem != null)
        {
            visualItem.DataContext = item;
            //Add the visualItem object to a list or StackPanel
            //...
        }
    }
}