Реализация DataTemplate DependencyProperty в UserControl - PullRequest
1 голос
/ 23 сентября 2011

Я пытаюсь создать список прокрутки intertia touch в UserControl в Silverlight 4, используя Expression Blend 4. Я уже создал свойства зависимостей в своем UserControl, которые я хочу работать так же, как ListBox.ItemSource - это список объектов, которые я хочу показать в моем списке, а таблица данных - это способ, которым он должен отображаться.

Как мне работать с этими свойствами внутри моего UserControl?У меня есть StackPanel, куда должны быть добавлены все таблицы данных, показывающие данные ofc.

Как применить данные в моем IEnumerable к DataTemplate при циклическом перемещении по ItemSource для добавления их в список (StackPanel).

        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 Ответ

1 голос
/ 24 сентября 2011

Свойства зависимостей весьма бесполезны, если не обрабатывать их изменения.Сначала вы должны добавить обратные вызовы 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 и установить элемент из ItemsSourceDataContext для возвращаемого визуального элемента:

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
            //...
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...