Как удалить элемент дерева в зависимости от значения?
У меня есть это древовидное представление с основной целью отображения открытых и закрытых окон в здании. На данный момент классы - "этаж", который содержит список комнат, "комнаты" со списком окон и класс "комнатное окно".
Я хочу отобразить открытые окна, закрытые окна или все окна, проверив соответствующую радиокнопку на основе логического значения 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". Это, кажется, работает хорошо только с одной проблемой. Теперь, если некоторые элементы окна свернуты, все еще остается пустое место, где был элемент.