繁体   English   中英

如何有效地处理Listview的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="&#xE70D;" 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="&#xE70E;" 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM