#c# #silverlight #xaml #windows-phone-7 #datatemplate
#c# #silverlight #xaml #windows-phone-7 #datatemplate
Вопрос:
Привет всем, я пишу приложение для Windows Phone в silverlight, и я пытаюсь динамически обновлять источник DataTemplate, который у меня есть. Вот xaml, который у меня есть:
<ListBox Grid.Row="1" Height="607" HorizontalAlignment="Left" Name="listBox1" VerticalAlignment="Top" Width="480">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="132">
<StackPanel Width="370">
<TextBlock Text="{Binding Transcription}" Foreground="#FFC8AB14" FontSize="28" />
<TextBlock Text="{Binding Duration}" TextWrapping="Wrap" FontSize="24" />
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
В C #, стоящем за этим, я передаю данные в основной функции инициализации следующим образом:
list.Add(new NoteToSelf { Transcription = "oh hi", Duration = "9001 seconds" });
list.Add(new NoteToSelf { Transcription = "fgsfds", Duration = "$Texas seconds" });
listBox1.ItemsSource = list;
Где list — это коллекция списков. Все это отлично работает — жестко закодированные данные отображаются на экране, как и ожидалось. Однако, когда я пытаюсь динамически обновить информацию, она автоматически завершается неудачей. Если я привязываю действие к кнопке, которая запускает этот код:
list.Add(new NoteToSelf { Transcription = "FFUUUUUUUU", Duration = "LISTBOX, Y U NO UPDATE?" });
listBox1.ItemsSource = list;
Я бы ожидал, что он добавит новый элемент в коллекцию, переназначит источник для DataTemplate, затем обновит экран новыми данными. Однако это не тот случай. Как бы мне это сделать?
Очевидно, что это POC-код, который является просто средством для достижения цели, я просто хочу, чтобы элементы динамически обновлялись в данный момент. Кроме того, я вполне могу подойти к этому неправильно, если есть лучший способ динамического добавления элементов на экран из шаблона, было бы очень полезно их услышать.
Спасибо всем.
Ответ №1:
Вы не указали, что это за тип list, но я собираюсь предположить, что это обычный список<>. Чтобы обновить пользовательский интерфейс, у него должен быть какой-то механизм уведомления. Платформа поддерживает это через INotifyPropertyChanged. Вы можете реализовать INotifyPropertyChanged в своем классе databound и обновлять вручную по мере добавления или использовать контейнер, который это реализует. Самый простой подход — заменить ваш список<> на ObservableCollection<> .
var list = new ObservableCollection<NoteToSelf>();
list.Add(new NoteToSelf { Transcription = "oh hi", Duration = "9001 seconds" });
list.Add(new NoteToSelf { Transcription = "fgsfds", Duration = "$Texas seconds" });
listBox1.ItemsSource = list;
Комментарии:
1. Ты полубог среди людей. Древние цивилизации строили статуи в знак вашей мудрости. На этом рисунке вы должны быть рядом с Нилом Бором: en.wikipedia.org/wiki/Solvay_Conference#Fifth_conference . «Почему ты Ромео?» это был не вопрос преданности Ромео Монтекки, а скорее страстная потребность Джульетты в том, чтобы Ромео был таким же полезным, умным и красивым, как вы. Спасибо Ритчу Мелтону.