2012-06-20 3 views
0

У меня есть ListPicker в мое приложение, которое определяется так:Получение пользовательских данных из ListPicker

<DataTemplate x:Name="PickerItemTemplate"> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="{Binding code}" Margin="12 0 0 0" Visibility="Collapsed"/> 
       <TextBlock Text="{Binding name}" Margin="12 0 0 0"/> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate x:Name="PickerFullModeItemTemplate"> 
      <StackPanel Orientation="Horizontal" Margin="16 21 0 20"> 
       <TextBlock Text="{Binding name}" Margin="16 0 0 0" 
FontSize="43" FontFamily="{StaticResource PhoneFontFamilyLight}"/> 
      </StackPanel> 
     </DataTemplate> 

<toolkit:ListPicker x:Name="_1stLanguageListPicker" 
        ItemTemplate="{StaticResource PickerItemTemplate}" 
        FullModeItemTemplate="{StaticResource PickerFullModeItemTemplate}" 
        Header="1st Specie Name Language" 
        FullModeHeader="1st Specie Name Language" 
        CacheMode="BitmapCache"/> 

Как вы можете видеть, что я показывать пользователю только полное имя, Hidding коде. Но как программист я хотел бы использовать кодовое имя.

Как добраться до этого имени?

Я попытался как то

if (_1stLanguageListPicker.SelectedIndex == 0) 
{ 
    firstlang = "GB" 
} 

Но не работает (некоторые BOOL для Int проблемы, нормальные = не работает также), и это плохой способ для списка много элементов, как вы должны положить много многие заявления IF.

+0

Databind список в коллекцию, то выбранный элемент является выбранным объектом. –

+0

Не совсем понимаю. Теперь список берет элементы из ObservableCollection. Итак, я должен снова сохранить список для разных ObservableCollection? – dargod

+0

http://windowsphonegeek.com/tips/Working-with-WP7-ListPicker-SelectedItem –

ответ

0

Насколько я понимаю, ваша задача - получить данные кода TextBlock в коде позади.

Сначала дайте некоторое имя для TextBlock

<TextBlock x:Name="codeTextBlock" Text="{Binding code}" /> 

А затем используйте следующий код для доступа к 'код'

if (listPicker.SelectedIndex > -1) 
     { 
      var item = listPicker.ItemContainerGenerator.ContainerFromIndex(listPicker.SelectedIndex); 
      SearchVisualTree(item); 
     } 

Здесь SearchVisualTree() является:

private void SearchVisualTree(DependencyObject targetElement) 
    { 
     var count = VisualTreeHelper.GetChildrenCount(targetElement); 
     if (count == 0) 
      return; 

     for (int i = 0; i < count; i++) 
     { 
      var child = VisualTreeHelper.GetChild(targetElement, i); 
      if (child is TextBlock) 
      { 
       TextBlock targetItem = (TextBlock)child; 

       if (targetItem.Name == "codeTextBlock") 
       { 
        var code = targetItem.Text; 
        return; 
       } 
      } 
      else 
      { 
       SearchVisualTree(child); 
      } 
     } 
    } 

Одна из возможных проблем (с которой вы столкнулись), мы не можем получить доступ к DataTemplate перед загрузкой ListPicker. В других работах перед созданием DataTemplate для ListPicker. Поэтому размещение вышеуказанного кода очень важно.

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

Смежные вопросы