Доступ к текстовому блоку, который содержится внутри ListBox

#c# #visual-studio #silverlight

#c# #visual-студия #silverlight #visual-studio

Вопрос:

У меня есть текстовый блок, который находится внутри listbox, и я пытаюсь написать оператор if, который зависит от содержимого этого текстового блока. Я пытаюсь получить данные из TextBlack, который я назвал «category1», однако, когда я пытаюсь написать свой оператор if, я получаю сообщение, в котором просто говорится

«имя category1 не существует в текущем контексте»

Я устал перемещать этот текстовый блок из ListBox, и он работает нормально, но не будет работать, пока он там внутри. Кто-нибудь знает, как ссылаться на этот текстовый блок.

Вот мой XAML-код

         <ListBox x:Name="HINList" Margin="0,300,-12,0" ItemsSource="{Binding Details}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="0,0,0,17" Width="432">
                        <TextBlock Text="{Binding HINNumber}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                        <TextBlock Text="{Binding CategoryLetter}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextNormalStyle}"/>
                        <TextBlock x:Name="category1" Text="{Binding Category1}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextNormalStyle}"/>
                        <TextBlock Text="{Binding Category2}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextNormalStyle}"/>
                        <TextBlock Text="{Binding Category3}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextNormalStyle}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
  

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

1. Для каждого элемента списка будет текстовый блок. Если вы пытаетесь определить, что такое Category1 для определенного элемента, почему бы не использовать сам фактический элемент в коллекции сведений?

Ответ №1:

Предполагая, что вы пишете свой оператор if в коде за файлом, не будет ли что-то вроде:

 if(((WhateverTypeIsInDetailsCollection)HINList.SelectedItem).Category1 == something) {
     // then do whatever you want
}
  

Как указал Рассел, для каждой записи в списке есть элемент category1. Я предполагаю, что вы хотели что-то сделать с выбранным элементом.

Ответ №2:

Это связано с xaml namescopes. Имена внутри DataTemplate находятся в другой области имен, чем снаружи, вот почему вы не можете получить к ним доступ (то, на что указал @ Russell, является частью того, почему это сделано таким образом).

Я думаю, что вы хотите получить доступ к этому полю для свойства «Category1» в выбранном элементе списка HINList, который привязан к коллекции сведений. Что вы можете сделать, так это установить двустороннюю привязку к Category1 и привязать SelectedItem ListBox к элементу Detail следующим образом:

xaml:

 <ListBox x:Name="HINList" ItemsSource="{Binding Details}"
         SelectedItem={Binding SelectedDetailItem, Mode=TwoWay}>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel Margin="0,0,0,17" Width="432">
        <TextBlock Text="{Binding Category1, Mode=TwoWay}" TextWrapping="Wrap" .../>
        <!-- the other fields -->
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>
  

скрытый код

 if(SelectedDetailsItem.Category1==...)
{
   ....
}
  

Надеюсь, это поможет 🙂