【问题标题】:How to filter treeview with ObservableCollection data如何使用 ObservableCollection 数据过滤树视图
【发布时间】:2014-11-01 19:59:30
【问题描述】:

我做了一个树视图示例,希望得到如下所示的结果:

有一组复选框(绿色、黄色和红色)并被选中。然后,有一个树视图。 如您所见,如果其中一个子节点包含红色/黄色,则其父节点也将变为相同颜色节点。比如 A 类的节点是红色的,因为学生 3 的节点是红色的。

如何在WPF c#中实现过滤树视图功能?

示例结果,

如果我取消选中绿色复选框,结果将是:

如果我取消选中绿色和黄色,结果将是:

可以在这里获取树视图示例

TreeView Sample

XAML 主窗口

<StackPanel Orientation="Vertical">
    <StackPanel Orientation="Vertical">
        <CheckBox Content="Green" Margin="2" />
        <CheckBox Content="Yellow" Margin="2" />
        <CheckBox Content="Red" Margin="2" IsChecked="True" />
    </StackPanel>
    <TreeView ItemsSource="{Binding ClassList}">
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type loc:Class}" ItemsSource="{Binding Students}">
                <Border Width="150" BorderThickness="1" CornerRadius="2" Margin="2" Padding="2" >
                    <StackPanel Orientation="Horizontal" >
                        <TextBlock  Text="{Binding Name}" FontWeight="Bold"></TextBlock>
                        <Image Margin="2" Source="{Binding ImagePath}"></Image>
                    </StackPanel>
                </Border>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate DataType="{x:Type loc:Student}">
                <Border Width="132" CornerRadius="2" Margin="1" >
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                            <ColumnDefinition Width="26"></ColumnDefinition>
                        </Grid.ColumnDefinitions>

                        <TextBlock Margin="2"  Text="{Binding Name}" ToolTip="{Binding ToolTip}"></TextBlock>

                        <Image Grid.Column="1" Margin="2" Source="{Binding ImagePath}"></Image>
                    </Grid>
                </Border>
            </HierarchicalDataTemplate>
        </TreeView.Resources>
    </TreeView>
</StackPanel>

【问题讨论】:

  • 你在你的 ViewModel 中使用一个集合来填充你的 TreeView 的数据吗?如果是这样,请将其添加到您的问题中。
  • @André Silva 嗨,是的,我已将 ObservableCollection 与 treeview 一起使用,示例源代码已上传。

标签: c# wpf user-controls treeview


【解决方案1】:

因此,您需要跟踪两个集合——一个是“过滤的”ObservableCollection,另一个是“主”ObservableCollection(具有 COMPLETE 树)。

因此,无论何时绑定到 TreeView 的 ItemsSource,都需要绑定到 FilteredObservableCollection。默认情况下,此集合将使用 MasterObservableCollection 中的所有项目进行初始化。

当有人更改 Checkbox(并且它的绑定反映在您的 ViewModel 中,即 IsRed = false)时,您的 ViewModel 上会有一些东西更新 FilteredObservableCollection。您将清除 FilteredObservableCollection 中的所有项目,然后循环通过 MasterObservableCollection,将符合条件的项目添加到其中。

所以,来自您的 ViewModel 的一些简短伪代码...

ObservableCollection<MyItem> MasterCollection;
ObservableCollection<MyItem> FilteredCollection;
bool IsRed, IsYellow, IsGreen; 

UpdateFilteredCollection()
{
    FilteredCollection.Clear();

    foreach( MyItem item in MasterCollection )
    {
        if( ( item.Color == Green && IsGreen ) || ( item.Color == Yellow && IsYellow ) || ( item.Color == Red && IsRed ) )
        {
            FilteredCollection.Add( item );
            /*
               And do this for child items, etc -- you'll probably
               have to rebuild the tree/MyItem's since some items
               will not appear under their parents;

               So this might look more like:

            FilteredCollection.Add( new MyItem()
                                    {
                                       Color = item.Color,
                                       Label = item.Label 
                                    } );
            */
        }
    }
}

【讨论】:

  • 嗨@Locke,因为我当前的实现是使用可观察的集合,并且基于您在进行过滤时给出的解决方案需要清除并重建树视图(将项目重新添加到集合中)。还有其他方法吗?
  • 您也许可以为每种类型(分层)设置一个 XAML DataTemplate,然后尝试将项目的高度(如果它绑定到 IsRed、IsGreen 等)设置为 0 并隐藏可见性。但是,我认为这不会调整实际的 TreeViewItem —— 只显示 within 的项目——所以你最终会在项目应该存在的地方有空白。
猜你喜欢
  • 2020-02-14
  • 2012-06-01
  • 2015-06-21
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 2015-07-12
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多