У меня есть следующий шаблон данных в просмотре списка и несколько отмеченных событий
в нем (XAML этого ниже). Чтобы скрыть / показать видимость элемента в шаблоне данных, я использую приведенную ниже логику (определяя мой исходный источник), чтобы определить, какой элемент управления в представлении списка вызвал событие. Проблема, с которой я сталкиваюсь при таком подходе, заключается в том, что даже при малейших изменениях в шаблоне данных я меняю логику событий при определении правильных потомков. Можно ли использовать эффективную логику, чтобы при каждом изменении макета мне не приходилось касаться кода позади?
XAML
<DataTemplate x:DataType="filter:FilterCategory">
<!--<RelativePanel>-->
<Grid Name="FilterHeaders">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="4*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Name="Header" FontSize="13" FontWeight="Bold" Margin="20,10,0,0" Text="{x:Bind NameAlias}" Grid.Column="0"/>
<RelativePanel Grid.Column="1">
<TextBlock Name="DownArrow" Text="" FontFamily="Segoe MDL2 Assets" FontSize="8"
Visibility="{x:Bind IsCollapsed}" Grid.Column="1" Tapped="DownArrow_Tapped"
RelativePanel.AlignRightWithPanel="True" HorizontalAlignment="Right" Margin="0,10,0,0"/>
<TextBlock Name="UpArrow" Text="" FontFamily="Segoe MDL2 Assets" FontSize="8"
Visibility="{x:Bind IsExpand}" RelativePanel.AlignRightWithPanel="True" Tapped="UpArrow_Tapped"
VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,10,0,0"/>
</RelativePanel>
<Grid Grid.Row="1" Grid.ColumnSpan="2" Visibility="{Binding ElementName=UpArrow,Path=Visibility}">
<ListView SelectionMode="None" ItemsSource="{x:Bind FilterCategoryItems}" ScrollViewer.VerticalScrollMode="Enabled">
<ListView.ItemContainerTransitions>
<TransitionCollection/>
</ListView.ItemContainerTransitions>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="FontSize" Value="13"/>
<Setter Property="MinHeight" Value="0"/>
<Setter Property="Margin" Value="5,0,0,0"/>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate x:DataType="filter:FilterCategoryItem">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30" />
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<CheckBox x:Name="FilterCheckBoxTask" Style="{StaticResource CheckBoxStylePlainView}" IsThreeState="False"
Opacity="0.2" MinWidth="10"/>
<TextBlock Grid.Column="1" Text="{x:Bind NameAlias}"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
<!--<ListView.FooterTemplate>
<DataTemplate>
<Grid>
<Button x:Name="LoadMore" Tag="{x:Bind Name}" Content="Load More" Click="LoadMore_Click" Visibility="Visible"/>
</Grid>
</DataTemplate>
</ListView.FooterTemplate>-->
</ListView>
<loading:LoadingControl Name="LoadingControl" IsShowGrid="{Binding IsShowResultGrid,Mode=TwoWay}"
IsShowProgressRing="{Binding IsShowProgressRing,Mode=TwoWay}"
ShowDisplayMessage="{Binding DisplayMessage,Mode=TwoWay}" />
</Grid>
</Grid>
</DataTemplate>
Код позади
private void DownArrow_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
{
if (e.OriginalSource is TextBlock textBlock)
{
textBlock.Visibility = Visibility.Collapsed;
if (textBlock.Parent is Grid grid)
{
if (grid.Children[2] is TextBlock textBlck)
textBlck.Visibility = Visibility.Visible;
}
}
}
private void UpArrow_Tapped(object sender, Windows.UI.Xaml.Input.TappedRoutedEventArgs e)
{
if (e.OriginalSource is TextBlock textBlock)
{
textBlock.Visibility = Visibility.Collapsed;
if (textBlock.Parent is Grid grid)
{
if (grid.Children[1] is TextBlock textBlck)
textBlck.Visibility = Visibility.Visible;
}
}
}