1

我有一个 Pivot,其内容是使用数据绑定生成的。对于向量中的每个 Item,都会生成一个 Grid,并在每个网格内生成一个 TextBlock。

如果我有来自向量的特定项目,我如何访问在我后面的代码中从它生成的相应 TextBlock?

我的第一个想法是将x:name每个 TextBlock 的属性设置为每个 Item 中保存的唯一标识符,然后我可以简单地调用FrameworkElement::FindName()该标识符,但显然x:name不允许使用数据绑定生成该属性。

我看到可以朝另一个方向前进,并通过调用它的 DataContext 从 TextBlock 中拉出 Item。

我看到我可以使用 VisualTreeHelper 开始按控件搜索 TextBlock 控件。我无法在 C++ 中找到示例,但是,在这种情况下如何使用它?这是唯一的方法吗?如此简单的事情似乎非常复杂。有没有更多的方法可以做到,正确的方法是什么?

我将 C++/CX 与 XAML 一起使用。

4

2 回答 2

2

Pivot is a descendant of ItemsControl, therefore:

Use https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.itemscontrol.containerfromitem.aspx or https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.controls.itemscontrol.containerfromindex.aspx and plus the VisualTreeHelper. (If the ItemTemplate is fixed, you can even do something like ((Grid)*YourReturnedDependencyObject*).Children[0] as TextBlock, so you don't even need the VisualTreeHelper.)

于 2015-08-10T13:36:20.903 回答
0

为了其他可能处于类似情况的人的利益,这是我最终实施的解决方案,但我将 Tamás Deme 的答案标记为已接受,因为它使我得到了这个结果。

// I am using dynamic_casts to determine if a returned object is of the expected class
auto currentPivotItem = dynamic_cast<PivotItem^>(myPivot->ContainerFromItem(myItem));
if (currentPivotItem != nullptr && VisualTreeHelper::GetChildrenCount(currentPivotItem) > 0)
{
    auto currentGrid = dynamic_cast<Grid^>(VisualTreeHelper::GetChild(currentPivotItem, 0));
    if (currentGrid != nullptr && VisualTreeHelper::GetChildrenCount(currentGrid) == 1)
        { // Through trial and error, I discovered there are 2 layers of unknownItems I need to traverse
        auto unknownItem = VisualTreeHelper::GetChild(currentGrid, 0);
        if (unknownItem != nullptr && VisualTreeHelper::GetChildrenCount(unknownItem) == 1)
            {
            auto unknownItem2 = VisualTreeHelper::GetChild(unknownItem, 0);
            if (unknownItem2 != nullptr && VisualTreeHelper::GetChildrenCount(unknownItem2) == 2)
                { // Based on my XAML, the TextBlock will always be the child at index 1
                auto currentTextBlock = dynamic_cast<TextBlock^>(VisualTreeHelper::GetChild(unknownItem2, 1));
                if (currentTextBlock != nullptr) currentTextBlock->Text = "Success!"
            }
        }
    }
}
于 2015-08-10T18:25:46.603 回答