[英]From Code Retrieve dynamically generated objects from listview's datatemplate
[英]How to effectively work with events generated from within a Listview's datatemplate
我在listview中有以下数据模板,并在其中有一些tapped事件(下面的XAML)。 为了隐藏/显示数据模板中项目的可见性,我使用下面的逻辑(确定我的原始源)来识别listview中哪个控件调用了一个事件。 我用这种方法看到的问题是,即使是数据模板中的最轻微的变化,我也在改变我的事件逻辑来确定正确的孩子。 是否有一个有效的逻辑可以使用,以便每次我更改布局,我不必触摸后面的代码?
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;
}
}
}
您需要使用Behaviors SDK,请参阅此处: XamlBehaviors
安装nuget软件包后,可以使用以下代码:
<TextBlock x:Name="mytext" Text="1" Grid.Column="0">
<Interactivity:Interaction.Behaviors>
<Interactions:EventTriggerBehavior EventName="Tapped">
<Interactions:ChangePropertyAction TargetObject="{Binding ElementName=mytext}" PropertyName="Visibility" Value="Collapsed"/>
</Interactions:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
</TextBlock>
有关更多详细信息,请参阅此文档 。
我需要承认,这可能无法满足您的所有需求。 实际上你不能知道这一行:grid.Children是TextBlock textBlck。 我有空的时候会考虑使用绑定和转换器。 但行为SDK在我看来是一个方向。 请先看看。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.