在XAML中获取grandparent-element

时间:2016-03-24 16:48:09

标签: c# xaml mvvm win-universal-app

我有一个Hub-Element,我想通过触摸/点击中心部分来浏览这些元素。由于HubSection-Elements不能点击(仅通过“SectionHeaderClick”,这会产生一个相当丑陋的“查看更多”链接),我已经使GridView可点击。

<Frame x:Name="frame">
  <Hub VerticalAlignment="Center" HorizontalAlignment="Center" >
     <HubSection Width="250" x:Name="section1"  IsHeaderInteractive="True" >
                    <DataTemplate>
                        <GridView IsItemClickEnabled="True" ItemClick="{x:Bind MainPageVM.click}">
                            <RelativePanel>
                                <Image x:Name="image" Source="Assets/1.png" Width="Auto" Height="250"  />
                                <TextBlock x:Name="page1" Text="page1" />
                            </RelativePanel>
                        </GridView>
                    </DataTemplate>
                </HubSection>

                //....
         </Hub>             
</Frame>

在我的ViewModel中,“click”-method应该将框架导航到page1

public void hubClick(object sender, ItemClickEventArgs e)
{
   GridView gridview = sender as GridView;
   // "GrandGrandParent" equivalent ?
   Frame frame = gridview.GrandGrandParent;
   frame.Navigate(typeof(View.page1));           
}

所以基本上我必须以MVVM风格访问frame元素。我该如何访问框架?

2 个答案:

答案 0 :(得分:0)

您可以在事件中使用VisualTreeHelper方法GetParent()

这是链接GetParent

var parent = VisualTreeHelper.GetParent(element);

答案 1 :(得分:0)

在MVVM模式中,您通常从视图模型层导航,您可以通过将包含在导航服务界面中的框架传递到视图模型中,而无需从视图模型层访问视图层。如果您实际上正在使用MVVM模式来执行单元测试等操作,那就是这样。如果您不打算单元测试导航 - 您通常可以在App类上公开指向您的框架的静态属性。