2012-05-15 3 views
0

Я хочу динамически создавать содержимое каждого элемента внутри ListBox - подумайте об этом как о списке элементов. Или подумайте о приложении телефонной книги с контактами, и каждый контакт имеет один или несколько телефонных номеров, которые отображаются под именем; имя - одно поле, номера телефонов - это второе поле. Но содержание поля номера телефона, очевидно, будет зависеть от номера телефона, на который указывает контакт.Windows Phone 7 - динамические элементы для ListBox

Как:

Andrew Adams <-- TextBlock for name 
650-123-2222 <-- "Item" for numbers 
490-222-3333 

Benny Benjamin 
650-123-3333 

Я попытался решить эту проблему путем создания второго ListBox для элемента чисел внутри основного ListBox элемента. Но я не знаю, как я могу заполнить эту вторую ListBox моделью с C#.

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
     <StackPanel Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" > 

      <ListBox Name="ContactResultsData" ItemsSource="{Binding Contacts}" Margin="24,0" Height="620"> 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <TextBlock Name="ContactName" Text="{Binding ContactName}" Style="{StaticResource PhoneTextLargeStyle}" /> 
          <ListBox Name="NumbersList" ItemsSource="{Binding NumbersList}"> 
           <TextBlock Name="Number" Text="{Binding Number}" Style="{StaticResource PhoneTextSmallStyle}" /> 
          </ListBox> 
         </StackPanel> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </StackPanel> 
    </Grid> 
</Grid> 

Вопрос будет: Как я могу установить NumbersList ItemsSource из C#? Или я могу решить свою проблему с помощью другого лучшего подхода?

+0

Ваш код выглядит хорошо для меня, вы можете предоставить модель, которую вы используете для «возврата» этого вида? – ColinE

+0

Ну, я не знаю, как установить модель в первую очередь для такого типа структуры (я могу заполнить внешний ListBox, но я не знаю, как заполнить внутренний ListBox). Я думаю, что это моя настоящая проблема :) –

+0

Просто, чтобы быть ясным; NumbersList в модели «Контакты» является общедоступным ObservableCollection NumbersList. NumberInfo предоставляет номер свойства. Должно ли это работать так? –

ответ

1

Вам нужно для установки ItemTemplate для вашего второго ListBox. Он должен выглядеть следующим образом:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
    <StackPanel Height="Auto" Width="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" > 

     <ListBox Name="ContactResultsData" ItemsSource="{Binding Contacts}" Margin="24,0" Height="620"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <TextBlock Name="ContactName" Text="{Binding ContactName}" Style="{StaticResource PhoneTextLargeStyle}" /> 
         <ListBox Name="NumbersList" ItemsSource="{Binding NumbersList}"> 
          <ListBox.ItemTemplate> 
           <DataTemplate> 
            <TextBlock Name="Number" Text="{Binding Number}" Style="{StaticResource PhoneTextSmallStyle}" /> 
           </DataTemplate> 
          </ListBox.ItemTemplate> 
         </ListBox> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </StackPanel> 
</Grid> 

На стороне записки, не дают свое имя элементы пользовательского интерфейса (имя или х: Name), если Вы не должны использовать их в коде позади или XAML. Это особенно актуально для элементов в ItemTemplate.

+0

Большое спасибо! Такая глупая ошибка, и я держал пари, что я мог бы смотреть на код и не видел бы этого и только задавался вопросом о ошибках привязки. Он работает сейчас! –

+0

Если я могу спросить о вашей стороне заметки; это из-за производительности? Это просто плохая привычка от других платформ. Спасибо за примечание! –

+0

Это не будет препятствовать производительности, это просто плохая привычка.Когда в контексте ItemTemplate существует много элементов, и поэтому многие элементы называются «Foo». Если вы не получаете доступ к этому элементу с помощью некоторых средств (например, привязка, триггеры), удалите его. Это больше для удобочитаемости xaml, чем что-либо еще –

0
  • Внутренний не может непосредственно содержать
  • Если NumbersList является IList или подобное, то вы не можете связываться с «Номер» - просто используйте {Binding} вместо
+0

NumbersList ObservableCollection NumbersList и NumberInfo предоставляет свойство Number. Но, как я уже говорил выше, я получаю ошибку привязки, которая предполагает, что внутренний ListBox не получает правильную модель/свойство данных ... –

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