Получение в ItemContainer Listbox при привязке данных - PullRequest
1 голос
/ 12 сентября 2008

Есть ли способ получить ItemContaner выбранного элемента в списке? В Silverlight 2.0 Beta 1 я мог, но контейнер скрыт в Beta 2 из Silverlight 2.0.

Я пытаюсь изменить размер элемента списка, когда он не выбран до определенного размера и когда выбран переменный размер. Я также хочу получить относительную позицию выбранного элемента для анимации. Вот почему мне нужно перейти к размеру и получить относительную страсть.

Я должен уточнить, я не добавляю элементы в список явно. Я использую привязку данных в xaml и DataTemplates. У меня проблемы с доступом к ItemContainer DataTemplate выбранного элемента.

Ответы [ 4 ]

2 голосов
/ 02 октября 2008

Существует способ получить Панель, содержащую UIElement элемента и отображение элементов в UIElement. Вы должны наследовать от ListBox (это на самом деле работает для любого ItemsControl) и переопределить PrepareContainerForItemOverride:

protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        base.PrepareContainerForItemOverride(element, item);
        var el = element as FrameworkElement;
        if (el != null)
        {
            // here is the elements's panel:
            _itemsHost = el.Parent as Panel;

            // item is original item inserted in Items or ItemsSource
            // we can save the mapping between items and FrameworElements:
            _elementMapping[item] = el;
        }
    }

Это немного хакерски, но работает просто отлично.

0 голосов
/ 02 мая 2012

Обновление для silverlight 5.

              <ListBox ItemsSource="{Binding Properties}">
                 <ListBox.ItemTemplate>
                    <DataTemplate>
                       <TextBlock Text="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}" />
                    </DataTemplate>
                 </ListBox.ItemTemplate>

RelativeSource AncestorType теперь поддерживается, что делает это намного проще.

0 голосов
/ 01 октября 2009

Похоже, что вы можете использовать относительную привязку, чтобы получить контейнер предметов из ItemTemplate.

<TextBlock YourTargetProperty="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type ListBoxItem}}, Mode=OneWay, Path=YourSourceProperty}" />

Я нашел это решение здесь .

0 голосов
/ 17 сентября 2008

Если вы добавляете элементы не-пользовательского интерфейса в список (например, строки или объекты данных не-пользовательского интерфейса), то это, вероятно, довольно сложно. Однако, если вы оборачиваете свои элементы в какой-то объект, производный от FrameworkElement, перед добавлением их в список, вы можете использовать TransformToVisual, чтобы получить относительный размер, и использовать Высота и Ширина, чтобы установить размер элемента.

Как правило, вы можете обернуть ваши объекты в ContentControl следующим образом. Вместо:

_ListBox.Items.Add(obj0);
_ListBox.Items.Add(obj1);

Сделайте это:

_ListBox.Items.Add(new ContentControl { Content = obj0 });
_ListBox.Items.Add(new ContentControl { Content = obj1 });

Теперь, когда вы получите _ListBox.SelectedItem, вы можете привести его к ContentControl, установить размер и получить относительную позицию. Если вам нужен оригинальный объект, просто получите значение свойства Content элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...