none
布局嵌套并有数据绑定的GridView如何获得具体的点击项? RRS feed

  • 问题

  • <FlipView Name="FlipViewItems" SelectionChanged="FlipViewItems_SelectionChanged">
        <FlipView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <GridView Name="GridViewItems" IsItemClickEnabled="True" ItemClick="GridViewItems_ItemClick" SelectionChanged="GridView_SelectionChanged" .....>
                        <Grid>
                            <Image Source="{Binding ItemsImage}" ....></Image>
                            <Image Name="Img" Source="test.png"  ....></Image>
                        </Grid>
                    </GridView>
                </Grid>
            </DataTemplate>
        </FlipView.ItemTemplate>
    </FlipView>
      你好,版主,如以上布局,请问下怎么获得GirdView的具体点击项并进行操作?比如
       
        if(this.GridViewItems.SelectedIndex == 1)
        {
            this.Img.Visibility = Visibility.Collapsed;
        }

    谢谢!

    2012年8月3日 2:16

答案

  • Hi,

    这种放在模板中的名字并不能直接得到,具体原因在于空间不同,在模板内部没问题,在外部则不行。

    通常的做法是通过VisualTreeHelper得到这个空间构成的所有子元素,需要注意的是VisualTreeHelper顾名思义需要可视元素构建完成之后才能够使用,我的做法是把这个方法写在FlipView的Loaded事件中,以下是我写的样例:

     <FlipView Name="FlipViewItems" Loaded="FlipViewItems_Loaded_1">。。。


    private void FlipViewItems_Loaded_1(object sender, RoutedEventArgs e)
            {
                VTree(this.FlipViewItems, 0);
            }
    
            private void VTree(DependencyObject parent, int level)
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); ++i)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(parent, i);
                    Debug.WriteLine(child.GetType().Name + ":" + child.GetValue(NameProperty));
                    VTree(child, ++level);
                }
            }

    以下是Output窗口中的结果:

    请注意我标记高亮的那一行就是你DataTemplate中写的那个GridView的Name。

    我因为测试方便所以改了你一些DataTemplate的中的内容(去掉了Image),所以才会有这样的结果,不过这并不影响VisualTreeHelper获取控件中的所有构成元素,这样你可以通过名字轻松找到要修改的内容,即使没有名字也可以通过上下之间的逻辑结构来找到。

    Hope this helps


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年8月6日 9:20
    版主

全部回复

  • Hi,

    这种放在模板中的名字并不能直接得到,具体原因在于空间不同,在模板内部没问题,在外部则不行。

    通常的做法是通过VisualTreeHelper得到这个空间构成的所有子元素,需要注意的是VisualTreeHelper顾名思义需要可视元素构建完成之后才能够使用,我的做法是把这个方法写在FlipView的Loaded事件中,以下是我写的样例:

     <FlipView Name="FlipViewItems" Loaded="FlipViewItems_Loaded_1">。。。


    private void FlipViewItems_Loaded_1(object sender, RoutedEventArgs e)
            {
                VTree(this.FlipViewItems, 0);
            }
    
            private void VTree(DependencyObject parent, int level)
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); ++i)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(parent, i);
                    Debug.WriteLine(child.GetType().Name + ":" + child.GetValue(NameProperty));
                    VTree(child, ++level);
                }
            }

    以下是Output窗口中的结果:

    请注意我标记高亮的那一行就是你DataTemplate中写的那个GridView的Name。

    我因为测试方便所以改了你一些DataTemplate的中的内容(去掉了Image),所以才会有这样的结果,不过这并不影响VisualTreeHelper获取控件中的所有构成元素,这样你可以通过名字轻松找到要修改的内容,即使没有名字也可以通过上下之间的逻辑结构来找到。

    Hope this helps


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年8月6日 9:20
    版主
  • Hi,

    能把你写的代码给我看一下吗?正常来说只要在页面完成初始化之后visualtreehelper就可以从中得到控件的可视树了。


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年9月6日 8:34
    版主