Динамическое обновление источника DataTemplate

#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 . «Почему ты Ромео?» это был не вопрос преданности Ромео Монтекки, а скорее страстная потребность Джульетты в том, чтобы Ромео был таким же полезным, умным и красивым, как вы. Спасибо Ритчу Мелтону.