Получите доступ к значению TextBlock, когда оно привязано

Я работаю над приложением для WP7, но у меня есть небольшая проблема:

<TextBlock Name="rName" 
           Text="{Binding LineOne2}" 
           TextWrapping="NoWrap" 
           Style="{StaticResource PhoneTextExtraLargeStyle}" />

У меня есть эта привязка Textblock к LineOne2, я настроил событие касания для запуска другой страницы при нажатии. Проблема в том, что когда я пытаюсь получить значение этого текста rName.Text, он показывает, что он недоступен.

Итак, я блуждал, есть ли возможный способ получить значение этого TextBlock, чтобы использовать его в качестве параметра для метода на другой странице, даже если он был обязательным? Или есть другой способ сделать это?

Мой список содержит 2 текстовых поля и изображение в панели стека.... Мне нужно нажать в этом текстовом поле, чтобы открыть новую страницу со значением этого текстового поля в этом значении страницы и в качестве параметра метода.

редактировать:

<ListBox ItemsSource="{Binding Items1}" 
         Margin="14,149,8,8" 
         Foreground="#FF7A0100" 
         Grid.RowSpan="2">
  <ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Name="featuredPanel" 
                  Orientation="Horizontal" 
                  Margin="0,0,0,17" 
                  Height="105" 
                  Width="432" 
                  Tap="featuredPanel_Tap">
                  <!--Replace rectangle with image-->
          <Image Height="100" 
                 Width="100" 
                 Source="{Binding ImagePath1}">
          </Image>
          <StackPanel Width="311">
            <TextBlock x:Name="rName" 
                       Text="{Binding LineOne1}" 
                       TextWrapping="NoWrap" 
                       Style="{StaticResource PhoneTextExtraLargeStyle}" />
            <TextBlock Text="{Binding LineTwo1}" 
                       TextWrapping="Wrap" 
                       Margin="12,-6,12,0" 
                       Style="{StaticResource PhoneTextSubtleStyle}" />
          </StackPanel>
        </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

Также я привязываю данные из файла XML.

Мне нужно использовать TextBox «rName», чтобы получить значение и использовать его для выполнения запроса linq в файле xml, чтобы получить адрес и номер телефона из этого файла XML и привязать их к текстовым полям на другой странице.


person user1200204    schedule 09.02.2012    source источник
comment
Поскольку свойство TextBlock.Text привязано к LineOne2, его значение должно быть таким, какое установлено для LineOne2. Поэтому вместо использования rName.Text просто прочитайте значение переменной LineOne2. Если это не работает, вам нужно опубликовать дополнительный XAML, окружающий этот TextBlock, например, если он является частью ListBox ItemTemplate, вам нужно показать это.   -  person Praetorian    schedule 09.02.2012
comment
Что ж, TextBlock является частью панели стека, а панель стека является частью ListBox. Я добавляю данные из xml.   -  person user1200204    schedule 09.02.2012


Ответы (3)


Причина, по которой вы не можете получить доступ к TextBlock по имени, заключается в том, что он является частью ItemTemplate ListBox.

Подумайте об этом, в ListBox будет столько же элементов, сколько элементов в коллекции Items1, так как же вы можете указать, на какой TextBlock вы ссылаетесь, если вы обращаетесь к нему по имени?

Есть несколько различных способов решить эту проблему. Один из способов — сохранить текущий выбранный элемент в обработчике featuredPanel_Tap. Добавьте эту строку в обработчик:

var currentItem = ((sender as StackPanel).DataContext) as MyItemType;

MyItemType — это тип объекта, который содержится в коллекции Items1. Затем вы можете получить доступ к тексту как currentItem.LineOne1 или currentItem.LineTwo1.

Другой способ — создать привязку TwoWay для свойства SelectedItem или SelectedIndex объекта ListBox. Связанный элемент будет автоматически обновлен до правильного объекта в пределах Items1, когда пользователь коснется элемента ListBox.

person Praetorian    schedule 09.02.2012

Если вы выполняете привязку, вы не должны напрямую обращаться к TextBlock. Однако, если вы хотите, вы можете сделать следующее:

XAML

<TextBlock x:Name="rName" Text="{Binding LineOne2, Mode=TwoWay}" TextWrapping="NoWrap" Style="{StaticResource PhoneTextExtraLargeStyle}" />

код позади

string text = rName.Text;
string text = LineOne2;

в любом случае должно работать, но вы должны просто получить прямой доступ к LineOne2

person MyKuLLSKI    schedule 09.02.2012
comment
Нет необходимости в привязке TwoWay, это TextBlock, а не TextBox - person Praetorian; 09.02.2012
comment
Я бросил его туда на случай, если он бросит что-то, что может изменить его через Имя - person MyKuLLSKI; 09.02.2012
comment
ну, мне нужно сделать так, как ты, и я собирался сделать это, но это не работает. Я не могу использовать rName. - person user1200204; 09.02.2012
comment
@user1200204 user1200204 Почему это не сработает? Возможно, вы могли бы опубликовать код C # о том, что вы пробовали? - person Edward; 09.02.2012
comment
Я сделал то же самое, что вы упомянули, я не могу получить к ним доступ, понятия не имею :( - person user1200204; 09.02.2012
comment
Чтобы получить доступ к этой переменной или текстовому блоку, вам нужно войти в код позади. Если нет, то вам нужны другие вещи, чтобы получить к нему доступ через объекты - person MyKuLLSKI; 09.02.2012

Есть 2 способа сделать это. Во-первых, вы используете глобальную переменную. По сути, вы объявляете общедоступную переменную внутри файла app.xaml.cs, и теперь у вас есть доступ к ней на любой странице. Второй способ — передать его как параметр в uri страницы.

Посетите эту страницу в App Hub для получения дополнительной информации.

Обновление: если вам нужно получить доступ к значению текстового блока, это также можно сделать двумя способами. Либо установите глобальную переменную или параметр, равный свойству, к которому вы привязываетесь в своей модели представления, либо, если вы используете код позади, просто установите его в свойство Text текстового блока.

person Edward    schedule 09.02.2012