Я использую окно списка 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.