Datatemplate中的UWP Grid

时间:2017-12-28 11:33:29

标签: c# xaml uwp pivot computer-science

我有Pivot我在Pivot.HeaderTemplate设置标题,它基本上只显示了Names的图书。在我的Pivot.ItemTemplate中,我想显示一个Grid,它是在我的.xaml.cs中构建的,但由于Grid位于我的DataTemplate中,我无法访问Grid x:Name在.xaml.cs中的代码中已经存在了。 books是一个包含NameTitle

的图书集

MainPage.xaml中

<Pivot ItemsSource="{x:Bind books}">

<Pivot.HeaderTemplate>
    <DataTemplate x:DataType="local:Book">
        <TextBlock Text="{x:Bind Name}"/>
    </DataTemplate>
</Pivot.HeaderTemplate>

<Pivot.ItemTemplate>
    <DataTemplate>
        <Grid 
            x:Name="BooksGrid" 
            BorderBrush="Black" BorderThickness="1 1 0 0" 
            Margin="0 10 0 0>
        </Grid>
    </DataTemplate>
</Pivot.ItemTemplate>

现在我想访问BooksGrid后面的代码并实际创建Grid

MainPage.xaml.cs中

public MainPage()
    {

        this.InitializeComponent();
    }

 private void DrawGrid()
    {

            //create columns of Grid
            for (int i = 0; i < booksize.XProperties.Count + 1; i++)
            {
                BooksGrid.ColumnDefinitions.Add(new ColumnDefinition
                {

                });

            }

            BooksGrid.ColumnDefinitions[0].Width = GridLength.Auto;
        }  

     ....

已经在BooksGrid.ColumnDefinitions.Add(...)处,我收到了无法找到BooksGrid的错误。 如果我没有将DrawGrid定义放在我的Grid中,也放在DataTemplate之外,我的Pivot就有效。因此,当MainPage.xaml.cs位于Grid

内时,DataTemplate找不到它

我已经读过,解决方案可能是我必须在Grid instance加载后访问我想要使用的DataTemplate。但我也不知道该怎么做。

编辑第一个解决方案:

我还在另一种方法中使用BooksGrid MainPage.xaml.cs中

private void DrawBooksFront(Front front)
    {
        int row;
        int column;
        column = booksize.XProperties.IndexOf(front.CustomProps[booksize.XLabel])+1;
        row = booksize.YProperties.IndexOf(front.CustomProps[booksize.YLabel])+1;
        Frame newFrame = new Frame();
        TaskBoardGrid.Children.Add(newFrame);
        Grid.SetColumn(newFrame, column);
        Grid.SetRow(newFrame, row);


    }

2 个答案:

答案 0 :(得分:4)

您无法访问BooksGrid的原因是因为它会为books集合中的每本书动态生成。因此,对于每本书,都会生成Grid

选项1:  您可以向网格添加Loaded事件:

<Pivot x:Name="Pivot" ItemsSource="{x:Bind books}">
    <Pivot.HeaderTemplate>
        <DataTemplate x:DataType="local:Book">
            <TextBlock Text="{x:Bind Name}"/>
        </DataTemplate>
    </Pivot.HeaderTemplate>

    <Pivot.ItemTemplate>
        <DataTemplate>
            <Grid 
                BorderBrush="Black" BorderThickness="1,1,0,0" 
                Margin="0,10,0,0" Loaded="DrawGrid">
            </Grid>
        </DataTemplate>
    </Pivot.ItemTemplate>

并在您的代码中:

    private void DrawGrid(object sender, RoutedEventArgs e)
    {
        Grid grid = sender as Grid;
        // Load your grid..
    }

编辑 - 选项2: 如果您想以不同的方式从代码中访问您的网格(如编辑中建议的那样),您可以随时执行以下操作:

private void DrawBooksFront(Front front)
{
        // Loop through the pivot's items and get the content from each item's ContentTemplate.
        foreach (var item in Pivot.Items)
        {
            PivotItem pivotItem = Pivot.ContainerFromItem(item) as PivotItem;
            Grid grid = pivotItem.ContentTemplate.LoadContent() as Grid;
            // Do something with the grid.
        }
}

答案 1 :(得分:1)

如果您的目标是以类似网格的方式在PivotItem内显示图书页面的预览[下图],那么您最好将GridView放入DataTemplate的{​​{1}}并使用数据绑定自动显示这些页面,这样就无需在您展示的Pivot.ItemTemplate中编写代码。

请分享有关您的应用的更多详细信息(您给出的内容以及最终结果应该是什么样),以便我们为您提供更好的帮助。

enter image description here