2016-12-15 7 views
1

У меня есть Listview внутри Listview, как вы можете видеть в моем коде. Я пытаюсь свернуть другие категории, когда открываю другое. Это возможно? Я пробовал много вещей, но я не знаю, как получить доступ к элементам в другом ряду ...Доступ к элементам внутри ListView

<ListView x:Name="MainListView" 
       ItemsSource="{x:Bind menu}"> 
     <ListView.ItemContainerStyle> 
      <Style TargetType="ListViewItem"> 
       <Setter Property="HorizontalContentAlignment" 
         Value="Stretch" /> 
      </Style> 
     </ListView.ItemContainerStyle> 
     <ListView.ItemTemplate> 
      <DataTemplate x:DataType="data:MainCategories"> 
       <Grid Background="blue"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition Height="Auto" /> 
        </Grid.RowDefinitions> 
        <TextBlock x:Name="test" 
           Text="{x:Bind CategoryName}" 
           Tapped="Category_TextBlock_Tapped" 
           FontSize="25" /> 
        <Grid Grid.Row="1" 
          Name="tittleGrid" 
          Background="Gray"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="1*" /> 
          <ColumnDefinition Width="1*" /> 
          <ColumnDefinition Width="1*" /> 
         </Grid.ColumnDefinitions> 
         <TextBlock Text="Name" 
            HorizontalAlignment="Center" /> 
         <Border BorderBrush="Black" 
           BorderThickness="1,0,1,0" 
           Grid.Column="1"> 
          <TextBlock HorizontalAlignment="Center" 
             Text="Price" /> 
         </Border> 
         <TextBlock Text="QUantity" 
            Grid.Column="2" 
            HorizontalAlignment="Center" /> 
        </Grid> 
        <ListView x:Name="SubListView" 
           Grid.Row="2" 
           Background="YellowGreen" 
           ItemsSource="{x:Bind SubMenuItems}"> 
         <ListView.ItemContainerStyle> 
          <Style TargetType="ListViewItem"> 
           <Setter Property="HorizontalContentAlignment" 
             Value="Stretch" /> 
           <Setter Property="Padding" 
             Value="0" /> 
           <Setter Property="VerticalContentAlignment" 
             Value="Stretch" /> 
          </Style> 
         </ListView.ItemContainerStyle> 
         <ListView.ItemTemplate> 
          <DataTemplate x:DataType="data:Dishes"> 
           <Grid> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="1*" /> 
             <ColumnDefinition Width="1*" /> 
             <ColumnDefinition Width="1*" /> 
            </Grid.ColumnDefinitions> 
            <TextBlock VerticalAlignment="Center" 
               Text="{x:Bind dishName}" 
               HorizontalAlignment="Center" /> 
            <Border BorderBrush="Black" 
              BorderThickness="1,0,1,0" 
              Grid.Column="1"> 
             <TextBlock VerticalAlignment="Center" 
                Grid.Column="1" 
                HorizontalAlignment="Center" 
                Text="{x:Bind dishPrice}" /> 
            </Border> 
            <TextBlock Grid.Column="2" 
               VerticalAlignment="Center" 
               HorizontalAlignment="Center" 
               Text="{x:Bind dishPrice}" /> 
           </Grid> 
          </DataTemplate> 
         </ListView.ItemTemplate> 
        </ListView> 
       </Grid> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

А вот метод тумблера видимости я сделал и работает нормально для одного я щелкая, но я хотят, чтобы свернуть все остальные, когда я развернуть один я нажимаю ... Я мог бы много ошибок в своем коде, но я своего рода новым для UWP

private void Category_TextBlock_Tapped(Object sender, TappedRoutedEventArgs e) 
    {   
     CloseAllOthers(); 
     TextBlock categoryName = sender as TextBlock; 
     Grid grid = (categoryName.Parent as Grid); 
     ToggleVisibility(grid); 

    } 

    private void ToggleVisibility(Grid grid) 
    { 

     foreach (var gr in grid.Children) 
     { 
      if (gr.GetType() == grid.GetType() || gr.GetType() == MainListView.GetType()) 
      { 
       if (gr.Visibility == Visibility.Visible) 
       { 
        gr.Visibility = Visibility.Collapsed; 
       } 
       else 
        gr.Visibility = Visibility.Visible; 
      } 
     } 
    } 

My result so far and the collapsed version

ответ

0

Вот упрощенный пример того, что вы хотите делать:

<ListView x:Name="menu" ItemsSource="{x:Bind MenuItems}" IsItemClickEnabled="True" ItemClick="onItemClick"> 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <!-- Disable virtualization --> 
      <StackPanel/> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
    <ListView.Resources> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
      <Setter Property="Padding" Value="0"/> 
      <Setter Property="MinHeight" Value="0"/> 
     </Style> 
    </ListView.Resources> 
    <ListView.ItemTemplate> 
     <DataTemplate x:DataType="local:MenuItem"> 
      <StackPanel> 
       <TextBlock Text="{x:Bind Text}" FontWeight="Bold" Margin="10,10,0,10"/> 
       <ListView x:Name="subMenu" ItemsSource="{x:Bind SubItems}" Visibility="Collapsed"> 
        <ListView.ItemTemplate> 
         <DataTemplate x:DataType="local:MenuItem"> 
          <TextBlock Margin="20,5,0,5" Text="{x:Bind Text}"/> 
         </DataTemplate> 
        </ListView.ItemTemplate> 
       </ListView> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
public class MenuItem 
{ 
    public string Text { get; set; } 
    public List<MenuItem> SubItems { get; set; } 
} 

public sealed partial class MainPage : Page 
{ 
    public List<MenuItem> MenuItems { get; } 

    public MainPage() 
    { 
     InitializeComponent(); 

     MenuItems = Enumerable.Range(1, 3).Select(i => new MenuItem() 
     { 
      Text = $"Menu item {i}", 
      SubItems = Enumerable.Range(1, 3).Select(j => new MenuItem() 
      { 
       Text = $"Sub item {i}.{j}", 
      }).ToList(), 
     }).ToList(); 
    } 

    private void onItemClick(object sender, ItemClickEventArgs e) 
    { 
     foreach (var item in menu.Items) 
     { 
      var container = (ListViewItem)menu.ContainerFromItem(item); 
      if (container != null) 
      { 
       var subMenu = (container.ContentTemplateRoot as FrameworkElement)?.FindName("subMenu") as FrameworkElement; 
       if (subMenu != null) 
       { 
        subMenu.Visibility = e.ClickedItem == item ? Visibility.Visible : Visibility.Collapsed; 
       } 
      } 
     } 
    } 
} 

Screenshot

Я не обязательно рекомендую этот подход; Я предпочитаю больше подход, основанный на данных, с привязками для управления видимостью подменю, когда выбран родительский элемент списка, а не прямой доступ к представлению, но это хорошо для простых сценариев.

Смежные вопросы