2016-10-06 6 views
0

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

код позади:

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: Я вырезать большую часть лишнего кода из этого (высота/ширина, фон, выравнивание, и т.д.), но я чувствую, что я должен упомянуть, что TextBox в вопрос довольно глубоко вложенными в этом фрагменте кода. Полное наследование:

ListView (lstMenus) - ListView.ItemTemplate - DataTemplate - StackPanel - Сетка - Сетка - AppBarButton - AppBarButton.Flyout - Flyout - Сетка - Сетка - TextBox (dateChosen)

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

+4

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

+0

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

+0

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

ответ

1

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

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

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