Доступ к экспандеру из группового стиля Listbox - PullRequest
0 голосов
/ 30 апреля 2009

Я использую окно списка WPF, которое привязано к ICollectionView, для отображения списка элементов, которые можно отфильтровать. И я использую контекстное меню в ListBox, чтобы сгруппировать элементы в ListBox. Для этого я определил групповой стиль в списке, и в нем есть расширитель. Код для того же, что и ниже. Весь код xaml находится в файле Generic.xaml, а элемент управления с этим ListBox является пользовательским элементом управления, определенным в библиотеке CustomControls.

                       <ListBox.GroupStyle>
                            <GroupStyle HidesIfEmpty="True">
                                <GroupStyle.ContainerStyle>
                                    <Style TargetType="{x:Type GroupItem}">
                                        <Setter Property="Margin" Value="0,0,0,5"/>
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                                    <Expander Style="{StaticResource GroupBoxExpander}" IsExpanded="True" 
                                                              BorderBrush="Black" BorderThickness="0,0,0,1" x:Name="expander">
                                                        <Expander.Header>
                                                            <DockPanel>
                                                                <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" 
                                                                           Margin="5,0,0,0" Width="100"/>
                                                            </DockPanel>
                                                        </Expander.Header>
                                                        <Expander.Content>
                                                            <ItemsPresenter/>
                                                        </Expander.Content>
                                                    </Expander>
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </Style>
                                </GroupStyle.ContainerStyle>
                            </GroupStyle>
                        </ListBox.GroupStyle>

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

Я пытаюсь получить расширитель следующим образом, но выгода здесь в том, что это может произойти только тогда, когда срабатывает событие выбора, измененного в списке:

FrameworkElement item = listbox.ItemContainerGenerator.ContainerFromItem (listbox.SelectedItem) as FrameworkElement; if (item! = null) { GroupItem groupItem = item.GetVisualParent (); if (groupItem! = null) { Expander expander = groupItem.Template.FindName ("expander", groupItem) как Expander; если (расширитель! = ноль) { expander.Collapsed + = new RoutedEventHandler (expander_Collapsed); } } }

Может ли кто-нибудь сообщить мне, если это будет правильная аппроксимация и как получить доступ к свойству IsExpanded экспандера в коде рядом с файлом, или я могу попытаться попробовать его другим способом?

Sowmi.

1 Ответ

0 голосов
/ 30 ноября 2009
       private void eve_PreviewMouseLeftButtonDown_Expander(object sender, MouseButtonEventArgs e)
        {
            GroupItem gi = sender as GroupItem;
            if (gi != null)
            {
                ControlTemplate ct = gi.Template;
                if (ct != null)
                {
                    DependencyObject content = ct.LoadContent();
                    Expander expander = content as Expander;
                    if (expander != null)
                    {
                        //Expand or collapse
                        expander.IsExpanded = !expander.IsExpanded;
                    } 
                }
            }
        }
...