x: Имя не существует в текущем контексте, но его родительский элемент существует

#c# #xaml #mvvm #uwp #winrt-xaml

#c# #xaml #mvvm #uwp #winrt-xaml

Вопрос:

Я хочу обновить некоторый текст во всплывающем окне. Однако, когда я пытаюсь установить его значение в коде, я получаю сообщение об ошибке «Имя ‘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 .Всплывающее окно — Всплывающее окно — Сетка — Сетка — Текстовое поле (Дата выбрана)

Я пытался установить свойство ‘x: Name’ для некоторых промежуточных тегов, но всегда получаю ту же проблему «не в текущем контексте», когда пытаюсь добраться до них из кода.

Комментарии:

1. Это DataTemplate не так «лишне», как вы себе представляли. Экземпляр DataTemplate может быть создан ноль раз, один раз или тысячу раз. С каким из этих нулевых или более экземпляров dateChosen вы ожидали взаимодействовать, и как вы ожидали, что фреймворк угадает ответ на этот вопрос?

2. Если вы используете шаблоны, вы должны использовать этот стиль MVVM, а не стиль winforms-event-handler (который в лучшем случае очень плохо работает с XAML).

3. Я пытался сделать выделение видимым перед добавлением / сохранением выделения во всей остальной части моего класса «Menu», но, основываясь на том, что сказал @EdPlunkett, кажется, мне нужно поместить его в свой класс menu, прежде чем я смогу его надежно отобразить.

4. Пока я не увижу ваш код, вы могли бы с таким же успехом говорить на идиоматическом тохарском. В этом комментарии нет ни одного предложения, которое передавало бы мне хоть малейшую информацию (нет, подождите, есть одно: «надежно отображать его» намекает на то, что вы можете находиться в заблокированном отделении). В противном случае вы могли бы нажимать случайные клавиши.

Ответ №1:

Этот вопрос возникает время от времени. Посмотрите здесь: http://blog.jerrynixon.com/2012/09/how-to-access-named-control-inside-xaml.html

Поскольку элемент управления находится в сгенерированном контейнере, он фактически больше не находится в области видимости. Вот почему вы не можете ссылаться на него. Вам нужно будет запросить у ListView контейнер, а затем запросить у контейнера элемент. В этой статье в блоге будут объяснены шаги. Это не так уж и сложно.

Подумайте об этом, кстати, если бы у вас было 10 элементов в вашем ListView, разве у вас не было бы 10 элементов с таким же именем? Конечно, вы не можете этого сделать. И именно поэтому существует эта проблема. ListView должен ограничивать область дочернего элемента, чтобы он не нарушал простой ООП.