从Listbox的groupstyle访问扩展器

时间:2009-04-30 08:59:41

标签: listbox expander

我正在使用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。

1 个答案:

答案 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;
                    } 
                }
            }
        }