2015-01-19 6 views
0

У меня есть это древовидная структура с основной целью отображения открытых и закрытых окон в здании. На данный момент классы - это «пол», который содержит список комнат, «номеров» со списком окон и классом «roomwindow».Как удалить элемент treeview на основе значения?

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

Есть ли способ временно скрыть или удалить элемент дерева «window» на основе логического значения окон комнаты? Или это единственная возможность выполнить итерацию в окне окна комнаты и удалить окна?

В 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); 
    } 
    //... 
+0

Можете ли вы использовать только подмножество коллекции и присвоить ее свойству 'ItemsSource'? Например. Вы можете выбрать подмножество только открытых окон и назначить его. – theMayer

+0

Звучит для меня как вы хотите привязать TreeViewItem.IsVisible к IsOpen –

+0

@devhedgehog Итак, вы имеете в виду что-то вроде BooleanToVisibilityConverter? – Sarasa

ответ

0

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