我正在使用WPF列表框,它将数据绑定到ICollectionView以显示可以过滤的项目列表。我正在使用ListBox上的上下文菜单对列表框中的项目进行分组。为此,我在Listbox上定义了一个groupstyle,它有一个扩展器。相同的代码如下。所有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的过滤器方法我根据与ListBox相关联的文本框中输入的字符串过滤列表框中的项目。因此,即使折叠组,如果完成搜索的项目位于折叠的展开器内,扩展器也会展开,并且该项目在列表框中可见。但是,问题是当从文本框中删除搜索字符串时,扩展器应该返回到其先前的状态,就像在此状态下到其折叠状态一样。为此,我试图获取exapnder的IsExpanded属性并根据其值,在搜索完成后将扩展器的状态设置为其先前的状态。
我试图通过以下方式获取扩展器,但是这里的问题是它只能在列表框的选择改变事件触发时发生:
FrameworkElement item = listbox.ItemContainerGenerator.ContainerFromItem(listbox.SelectedItem)as FrameworkElement; if(item!= null) { GroupItem groupItem = item.GetVisualParent(); if(groupItem!= null) { Expander expander = groupItem.Template.FindName(“expandder”,groupItem)as Expander; if(expandder!= null) { expandder.Collapsed + = new RoutedEventHandler(expander_Collapsed); } } }
有谁能告诉我这是否是一个正确的appraoch以及如何在文件旁边的代码中访问扩展器的IsExpanded属性,或者我可以尝试以不同的方式尝试它?
Sowmi。
答案 0 :(得分:0)
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;
}
}
}
}