Listbox Get SelectedItem в ItemsPanel

У меня есть список с настраиваемой панелью стека (сейчас просто класс расширил стековую панель, но я надеюсь сделать здесь некоторую анимацию) в качестве его панели элементов. Теперь, когда выбор меняется, я подумал о том, чтобы сделать красивую анимацию между последним выбранным элементом и текущим выбранным элементом.

Теперь моя проблема в том, как мне получить выбранный элемент на панели элементов?

Вот как я определяю свои itemspanel

<ItemsPanelTemplate>
                    <l:CustomStackPanel SelectedItem="{Binding SelectedItem,ElementName=listbox}"  IsItemsHost="True" Orientation="Vertical"/>
                </ItemsPanelTemplate>

Я создал свойство зависимостей в своей пользовательской панели стека под названием SelectedItem

public UIElement SelectedItem
        {
            get { return (UIElement)GetValue(SelectedItemProperty); }
            set { SetValue(SelectedItemProperty, value); }
        }

        // Using a DependencyProperty as the backing store for SelectedItem.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty SelectedItemProperty =
            DependencyProperty.Register("SelectedItem", typeof(UIElement), typeof(CustomStackPanel), new PropertyMetadata(null,selectionChanged));

И я подумал, что могу просто привязать selectedItem в моем списке к выбранному элементу на панели стека. Но такой подход просто не работает.

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


person Krishna    schedule 26.06.2014    source источник
comment
Если вы используете привязку, то SelectedItem будет не типа UIElement, а типа связанного элемента списка. Selector.SelectedItem относится к типу Object. Вы хотите ListBoxItem?   -  person dkozl    schedule 26.06.2014
comment
Да, мне нужен ListBoxItem. Мое намерение состояло в том, чтобы «осветить» элементы между текущим и предыдущим выбранными элементами (например, создание анимированного пути при изменении выделения). Поскольку дочерние элементы stackpanel принадлежат UIElement Collection, я думал, что выбранный элемент будет иметь тип UIElement?   -  person Krishna    schedule 26.06.2014
comment
Связанные элементы обертываются ListBoxItem для отображения, но SelectedItem(s) остаются в привязанном типе элемента списка. Вы можете получить ListBoxItem из SelectedItem, используя _ 5_   -  person dkozl    schedule 26.06.2014
comment
Спасибо. Я думаю, это указывает мне правильное направление. Как вы думаете, я смогу добиться такого эффекта анимации, используя такой подход? Мне нужно получить индекс последнего выбранного элемента и индекс текущего выбранного элемента. И мне нужно оживить все элементы между этими двумя элементами.   -  person Krishna    schedule 26.06.2014
comment
Я не думаю, что вы можете добиться того, чего хотите - подсвечивать промежуточные элементы - в чистом XAML, но в коде это выполнимо.   -  person dkozl    schedule 26.06.2014
comment
Да, я пытаюсь сделать это в коде. Вот почему я создал CustomStackPanel, чтобы получить доступ ко всем дочерним элементам. Мне просто нужно поместить элементы между выбранными элементами.   -  person Krishna    schedule 26.06.2014


Ответы (1)


Используйте RelativeSource в своей привязке

<ItemsPanelTemplate>
     <l:CustomStackPanel SelectedItem="{Binding SelectedItem,RelativeSource={RelativeSource FindAncestor, AncestorType=x:Type ListBox}}"  IsItemsHost="True" Orientation="Vertical"/>
 </ItemsPanelTemplate>
person Nitin    schedule 26.06.2014
comment
Изменить - на самом деле он работает, как только я меняю свой тип с UIElement на свой фактический тип (например, ItemViewModel). Но мне он нужен как UIElement из коллекции Children стековой панели, чтобы я мог делать некоторую анимацию. :( - person Krishna; 26.06.2014
comment
вы не можете получить UIelement с помощью привязки ... как предлагает @dkozl, вам придется использовать ItemContainerGenerator, как только вы получите выбранный элемент, как я предлагал - person Nitin; 26.06.2014