Как сделать сетку видимой в DataTemplateSelector

У меня есть DataTemplate ItemsControl, который содержит 2 сетки. Вторая сетка свернута, и я хочу сделать ее видимой, когда я нажимаю на элемент в ItemsControl.

Вот XAML:

<ItemsControl.Resources>
   <DataTemplate x:Key="magazineSlotTemplate">
       <Grid>
           <Grid x:Name="buttonGrid">
               <Button Margin="4" Style="{StaticResource TransparentButtonStyle}" Click="ClickEvent">
                   <Grid>
                       <Grid.ColumnDefinitions>
                           <ColumnDefinition Width="Auto"/>
                           <ColumnDefinition Width="Auto"/>
                       </Grid.ColumnDefinitions>
                       <Grid.RowDefinitions>
                           <RowDefinition Height="Auto"/>
                           <RowDefinition Height="Auto"/>
                       </Grid.RowDefinitions>
                       <Path Width="48" Height="48" Fill="{Binding Color, Mode=OneWay}" Grid.RowSpan="2" Data="M24,14z"/>
                       <Ellipse Width="20" Height="20" Fill="{Binding ColorTwo, Mode=OneWay}" Grid.RowSpan="2"/>
                       <Image Width="48" Height="48" Grid.Column="0" Grid.ColumnSpan="1" Grid.Row="0" Grid.RowSpan="2" Source="pack://application:,,,/Resources/tool.png"/>
                       <ProgressBar Orientation="Vertical" Width="15" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2"/>
                       <TextBlock Grid.Column="1" Grid.Row="0" Text="24%" FontSize="11">
                           <TextBlock.LayoutTransform>
                               <RotateTransform Angle="-90"/>
                           </TextBlock.LayoutTransform>
                       </TextBlock>
                   </Grid>
               </Button>
           </Grid>

           <Grid x:Name="editGrid" Visibility="Collapsed">
               <Grid x:Name="gridMare">
                   <Grid.RowDefinitions>
                       <RowDefinition Height="Auto"/>
                       <RowDefinition Height="Auto"/>
                   </Grid.RowDefinitions>
                   <Grid Grid.Row="0">
                       <Grid.ColumnDefinitions>
                           <ColumnDefinition Width="Auto"/>
                           <ColumnDefinition Width="*"/>
                       </Grid.ColumnDefinitions>
                       <CheckBox Grid.Column="0" VerticalAlignment="Center" Margin="2,2,2,2" HorizontalAlignment="Center" IsChecked="{Binding IsPresent, Mode=OneWay}" IsEnabled="False">
                           <CheckBox.LayoutTransform>
                               <ScaleTransform ScaleX="1.6" ScaleY="1.6"/>
                           </CheckBox.LayoutTransform>
                       </CheckBox>
                       <ComboBox x:Name="cmb" Grid.Column="1" Margin="2" ItemsSource="{Binding Available, Mode=OneWay}" SelectedValue="{Binding CurrentType}"/>

                   </Grid>

Вот код, в котором ceControl — это DataTemplateSelector, а MagazineSlotTemplate — это DataTemplate, который использует статический ресурс из приведенного выше шаблона.

Я вижу вторую сетку в коде позади, но когда я устанавливаю видимость видимой, она становится видимой, но свойство IsVisisble имеет значение false, поэтому я не вижу сетку

private void ClickEvent(object sender, RoutedEventArgs e)
{
   var template = ceControl.MagazineSlotTemplate.LoadContent() as FrameworkElement;
   var myGrid = (Grid)template.FindName("editGrid");
   myGrid.Visibility = Visibility.Visible;
   var visible = myGrid.IsVisible;
}

person thiseful    schedule 21.12.2016    source источник


Ответы (1)


Вам нужно получить ссылку на фактический элемент сетки, который виден на экране. Вы можете найти его в визуальном дереве. Попробуй это:

private void ClickEvent(object sender, RoutedEventArgs e)
{
    Button button = sender as Button;
    Grid buttonGrid = button.Parent as Grid;
    if (buttonGrid != null)
    {
        Grid grid = buttonGrid.Parent as Grid;
        if (grid != null)
        {
            Grid editGrid = grid.Children.OfType<Grid>().FirstOrDefault(g => g.Name == "editGrid");
            if (editGrid != null)
            {
                editGrid.Visibility = Visibility.Visible;
            }
        }
    }
}

DataTemplate.LoadContent() создает новые элементы, и это не те элементы, которые вы видите на экране.

person mm8    schedule 21.12.2016