#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 должен ограничивать область дочернего элемента, чтобы он не нарушал простой ООП.