x:Name在当前上下文中不存在,但它的父对象存在

本文关键字:存在 对象 不存在 Name 上下文 | 更新日期: 2023-09-27 18:11:48

我想在弹出框上更新一些文本。但是,当我试图在代码中设置其值时,我得到错误"名称'dateChosen'不存在于当前上下文中"。

背后的代码:

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怎么可能存在,而不是它里面的文本框?

PS:我已经削减了大部分多余的代码(高度/宽度,背景,对齐等),但我觉得我应该提到的问题的文本框是相当深嵌套在这块代码。完整的继承是:

ListView(lstMenus) - ListView。ItemTemplate - DataTemplate - StackPanel - Grid - Grid - AppBarButton - AppBarButton。弹出框-弹出框-网格-网格-文本框(dateChosen)

我已经尝试设置'x:Name'属性的一些干预标签,但总是得到相同的"不在当前上下文中"的问题,当我试图达到他们从后面的代码

x:Name在当前上下文中不存在,但它的父对象存在

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

由于控件位于生成的容器中,因此它实际上不再在作用域中。这就是为什么你不能引用它。您必须向ListView请求容器,然后向容器请求元素。那篇博客文章将解释这些步骤。其实没那么难。

想想这个,顺便说一下,如果你有10个项目在你的ListView中,你不会有10个项目具有相同的名称吗?当然,你不能那样做。这就是这个问题存在的原因。ListView必须约束子项目的作用域,这样它就不会违反简单的OOP。