我已经完成了一个树视图示例,并希望得到如下所示的结果:
有一组复选框(绿色,黄色和红色)并正在检查中。然后,有一个树视图。 如您所见,如果其中一个孩子包含红色/黄色,他们的父母也会转向相同颜色的节点。例如,A类带有红色节点,因为Student 3它的节点是红色。
如何在WPF c#中实现过滤树视图功能?
示例结果,
如果我取消选中绿色复选框,结果将是:
如果我取消选中绿色和黄色,结果将是:
可以在这里获取treeview示例
主窗口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>
答案 0 :(得分:1)
所以,你需要跟踪两个集合 - 一个是“Filtered”ObservableCollcetion,另一个是“Master”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
} );
*/
}
}
}