Как удалить элемент дерева в зависимости от значения?

У меня есть это древовидное представление с основной целью отображения открытых и закрытых окон в здании. На данный момент классы - "этаж", который содержит список комнат, "комнаты" со списком окон и класс "комнатное окно".

Я хочу отобразить открытые окна, закрытые окна или все окна, проверив соответствующую радиокнопку на основе логического значения isOpen класса roomwindow.

Есть ли способ временно скрыть или удалить "древовидный" элемент дерева в зависимости от логического значения окон комнаты? Или это единственная возможность перебирать список окон комнаты и удалять окна?

WindowCheck.xaml.cs

<Window x:Class="WpfApplication3.WindowCheck"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication3"
   Title="WindowCheck" Height="350" Width="525" x:Name= "WindowCheckWindow">

<Grid Margin="104,113,60,0">
    <Grid.Resources>
        <local:BoolToVisibleOrHidden x:Key="BoolToVisConverter" Reverse="False"/>
        <local:BoolToVisibleOrHidden x:Key="BoolToVisConverterReverse" Reverse="True"/>         
    </Grid.Resources>

    <RadioButton x:Name="rdbtn_open" Content="Open windows" HorizontalAlignment="Left" Height="43" Margin="99,-79,0,0" VerticalAlignment="Top" Width="118"/>
    <RadioButton x:Name="rdbtn_closed" Content="Closed windows" HorizontalAlignment="Left" Height="43" Margin="256,-79,-30,0" VerticalAlignment="Top" Width="127" />
    <RadioButton x:Name="rdbtn_all" Content="All windows" HorizontalAlignment="Left" Margin="-55,-79,0,0" VerticalAlignment="Top" Height="33" Width="96"/>

    <TreeView ItemsSource="{Binding FloorList, ElementName=WindowCheckWindow, Mode=TwoWay}">
        <!--RoomTemplate-->
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate  ItemsSource="{Binding RoomList}">
                <TextBlock Text="{Binding FloorId}"/>
                <HierarchicalDataTemplate.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding RoomWindowList}">
                        <TextBlock Text="{Binding RoomId}" />

                        <!--Window-->
                        <HierarchicalDataTemplate.ItemTemplate>
                            <DataTemplate >
                                <TextBlock Text="{Binding WindowId}" >
                                    <TextBlock.Style>
                                        <Style>
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding IsChecked, ElementName=rdbtn_closed}" Value="True">
                                                    <Setter Property= "TextBlock.Visibility" Value="{Binding Path= IsOpen, Converter={StaticResource BoolToVisConverter}}" />
                                                </DataTrigger>
                                                <DataTrigger Binding="{Binding IsChecked, ElementName=rdbtn_open}" Value="True">
                                                    <Setter Property="TextBlock.Visibility" Value="{Binding Path=IsOpen,Converter={StaticResource BoolToVisConverterReverse}}" />
                                                </DataTrigger>
                                                <DataTrigger Binding="{Binding IsChecked, ElementName=rdbtn_all}" Value="True">
                                                    <Setter Property="TextBlock.Visibility" Value="Visible"/>
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </TextBlock.Style>
                                </TextBlock>
                            </DataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Style.Triggers>
                    <DataTrigger Binding ="{ Binding IsOpen}" Value="True">
                        <Setter Property="Background" Value="Salmon"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding IsOpen}" Value="False">
                        <Setter Property="Background" Value="GreenYellow">
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
            </TreeView.ItemContainerStyle> 
    </TreeView>
</Grid>

MainWindow.xaml.cs, где инициализируется тестовое здание:

 public partial class MainWindow : Window
{
   private Floor floor;

    public MainWindow()
    {
        InitializeComponent();
        InitializeBuilding();
    }

    public void InitializeBuilding()
    {
        floor = new Floor("FirstFloor");  

        List<RoomWindow> bathroomWindows = new List<RoomWindow>();
        bathroomWindows.Add(new RoomWindow("Bathroom window 1", false));
      //etc.

       List<RoomWindow> livingroomWindows = new List<RoomWindow>();
    livingroomWindows.Add(new RoomWindow("Livingroom window 1", false));
  //etc.

    Room livingRoom = new Room("Livingroom",livingroomWindows,floor);
    Room bathRoom = new Room("Bathroom",bathroomWindows,floor);

    floor.addRooms(livingRoom);
    floor.addRooms(bathRoom);
    }
   //...

1 ответ

Я добавил пользовательский BooleanToVisibilityConverter, который скрывает окна на основе логического значения "isOpen". Это, кажется, работает хорошо только с одной проблемой. Теперь, если некоторые элементы окна свернуты, все еще остается пустое место, где был элемент.

Другие вопросы по тегам