【问题标题】:UWP - can't access values in ItemsPanelUWP - 无法访问 ItemsPanel 中的值
【发布时间】:2018-02-26 13:42:22
【问题描述】:

我有以下 XAML,但我似乎无法访问相应 .CS 文件中 ItemsWrapGrid 的内容 - 谁能告诉我我应该做什么(这是背​​后的代码和 xaml):

private void wifiTapped(object sender, TappedRoutedEventArgs e)
        {
            Debug.WriteLine("in here " + e.GetType().ToString());
            ItemsWrapGrid wg = (ItemsWrapGrid) sender;

            Debug.WriteLine(e.OriginalSource.ToString());
            foreach (Control c in wg.Children)
            {
                Debug.WriteLine("Control " + c.Name);

            }

            Debug.WriteLine("leaving ");
        }





<GridView VerticalAlignment="Top" ItemsSource="{Binding nets}" x:Name="GDView" ItemClick="gdViewClick" >
            <GridView.ItemTemplate>
                <DataTemplate x:Name="configDataTemplate" x:DataType="data:wifiNets" >
                    <StackPanel Height="300" Width="350" Margin="10" Name="dtStackPanel" >
                        <Image Source="Assets\wifiIcon.png" Width="200" Height="201"  />
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="Name" Margin="0,0,10,0"/>
                            <TextBlock Name="configSSID" Width="auto"  Text="{x:Bind NetSSID}" FontSize="24" />
                        </StackPanel>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="Strength"  Margin="0,0,10,0"/>
                            <!--<TextBlock Name="configStrength" Width="auto" Text="{x:Bind NetSSIDStrength}" FontSize="20" />-->
                            <ProgressBar Name="configProgBar" Maximum="5" Value="{x:Bind NetSSIDStrength}" Foreground="Green"  />
                        </StackPanel>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="Connected" Margin="0,0,10,0"/>
                            <TextBlock Name="configConnectedTo" Text="{x:Bind NetSSIDConnected}" FontSize="20"/>
                        </StackPanel>

                    </StackPanel>
                </DataTemplate>
            </GridView.ItemTemplate>

            <GridView.ItemsPanel>
                <ItemsPanelTemplate>
                    <ItemsWrapGrid MaximumRowsOrColumns="10" Orientation="Vertical"  Tapped="wifiTapped" />
                </ItemsPanelTemplate>
            </GridView.ItemsPanel>
        </GridView> 

为了清楚起见,当我运行它时,我有三项数据(所以它正在工作) - 但我想做的是点击这三个数据项中的任何一项并能够识别数据面板中的各个控件及其值。

提前谢谢,这让我发疯了。 保罗。

【问题讨论】:

  • 到目前为止,我可以看到,wifiTapped() 是为整个 ItemsWrapGrid 定义的。为什么你不使用 gdViewClick() 代替?毕竟,UWP 打算使用 MVVM 方法,所以您可以尝试将您的逻辑移动到视图模型而不是代码隐藏吗?
  • 我必须正确检查,但我相信ChildrenItemsSource 是两个完全不同的东西。您是否尝试在代码隐藏中访问 ItemsSource
  • 大家好,我在下面使用了 Jonny 的 cmets,并将 e.clickeditem 转换为绑定数据的类型 - 这正是我所需要的。

标签: c# xaml uwp itemspanel


【解决方案1】:

在您的 GridView 上将 IsItemClickEnabled 设置为 true,并挂钩到 GridView 本身的 ItemClick 事件。从事件 args 中,您可以获得发送者(很可能是 GridViewItem UI 元素本身,其中您的 DataTemplate 内容是子元素)和 ClickedItem,它是数据模板的绑定数据上下文 - 在您的以 data:wifiNets 的实例为例 - 如果您的绑定有效,则意味着您实际上根本不必查看 VisualTree。

如果出于某种原因您想通过 VisualChildren 递归任何 ItemsControl 的项目,请使用 ItemsControl 上的 ContainerFromIndexContainerFromItem 方法来获取托管数据模板的每个实例的 ItemContainer - 尽管我不会除非你真的需要,否则建议这样做。理想情况下,您不应该经常需要手动拖网可视化树。

【讨论】: