Динамическое обновление источника DataTemplate - PullRequest
1 голос
/ 10 мая 2011

Привет всем, я пишу приложение для 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 # за этим я передаю данные в основной функции init следующим образом:

        list.Add(new NoteToSelf { Transcription = "oh hi", Duration = "9001 seconds" });
        list.Add(new NoteToSelf { Transcription = "fgsfds", Duration = "$Texas seconds" });
        listBox1.ItemsSource = list;   

Где список - это коллекция списков. Все это прекрасно работает - жестко закодированные данные отображаются на экране, как и ожидалось. Однако, когда я пытаюсь динамически обновить информацию, она молча терпит неудачу. Если я связываю действие с кнопкой, которая выполняет этот код:

        list.Add(new NoteToSelf { Transcription = "FFUUUUUUUU", Duration = "LISTBOX, Y U NO UPDATE?" });
        listBox1.ItemsSource = list;

Я ожидаю, что он добавит новый элемент в коллекцию, переназначит источник для DataTemplate, а затем обновит экран новыми данными. Это, однако, не тот случай. Как мне это сделать?

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

Спасибо всем.

1 Ответ

5 голосов
/ 10 мая 2011

Вы не указали, что это был за список типов, но я собираюсь предположить, что это простой список <>. Для обновления пользовательского интерфейса необходим механизм уведомлений. Платформа поддерживает это через INotifyPropertyChanged. Вы можете реализовать INotifyPropertyChanged в своем классе данных и вручную обновлять его по мере добавления или использовать контейнер, который его реализует. Самый простой подход - заменить ваш List <> на 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;
...