x:Name 在当前上下文中不存在,但其父级存在

x:Name does not exist in the current context, but its parent does

我想更新弹出窗口中的一些文本。但是,当我尝试在后面的代码中设置它的值时,出现错误 "The name 'dateChosen' does not exist in the current context".

后面的代码:

private void updateDateBinding()
{
    lstMenus.Visibility = Visibility.Visible;
    dateChosen.Text = ""; // <-- Error here
}

Xaml代码:

    <ListView x:Name="lstMenus">

<!-- ...other code... -->

        <TextBox x:Name="dateChosen" IsReadOnly="True"
                 Text="{Binding getDateChosen, Mode=TwoWay}"/>

<!-- ...other code... -->

    </ListView>

最初我只打算使用 PropertyChanged 事件来更新 'dateChosen' 但在调用该事件时它没有更新。所以我决定改为显式设置值,结果发现了这个问题。

让我感到困惑的是 'lstMenus' 可以完全按照我的预期进行更改。我的ListView怎么可能存在,里面的TextBox却没有?

-

PS:我已经从中删除了大部分多余的代码(Height/Width、背景、对齐等),但我觉得我应该提一下,所讨论的 TextBox 非常深入地嵌套在这段代码。完整的继承是:

ListView(lstMenus) - ListView.ItemTemplate - DataTemplate - StackPanel - Grid - Grid - AppBarButton - AppBarButton.Flyout - Flyout - Grid - Grid - TextBox(dateChosen)

我已经尝试为一些中间标记设置 'x:Name' 属性,但是当我尝试从后面的代码访问它们时,总是遇到相同的 "not in current context" 问题。

这个问题时常出现。看这里:http://blog.jerrynixon.com/2012/09/how-to-access-named-control-inside-xaml.html

由于控件位于生成的容器中,因此它实际上已不在范围内。这就是为什么你不能引用它。您将不得不向 ListView 询问容器,然后向容器询问元素。该博客文章将解释这些步骤。这并不难。

想一想,如果你的 ListView 中有 10 个项目,你不会有 10 个同名的项目吗?当然,你不能那样做。而且,这就是这个问题存在的原因。 ListView 必须限制子项的范围,以免违反简单的 OOP。