动态更新DataTemplate的源代码

jjc*_*jcm 1 c# silverlight xaml datatemplate windows-phone-7

嘿所有,我正在用Silverlight编写一个Windows Phone应用程序,我正在尝试动态更新我已经拥有的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>
Run Code Online (Sandbox Code Playgroud)

在它后面的C#中,我在主init函数中传递数据,如下所示:

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

列表是List集合.所有这一切都很有效 - 硬编码数据在屏幕上按预期显示.但是,当我尝试动态更新信息时,它会无声地失败.如果我将操作绑定到运行此代码的按钮:

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

我希望它为集合添加一个新元素,重新分配DataTemplate的源代码,然后用新数据更新屏幕.然而事实并非如此.我该怎么做呢?

显然这是POC代码,它只是达到目的的手段,我只是想让元素在此刻动态更新.此外,我可能会以错误的方式接近这一点,如果有更好的方法从模板动态添加屏幕上的元素,那么听到它们会非常有帮助.

谢谢大家.

Rit*_*ton 5

你没有说明是什么类型列表,但我将假设它是一个普通的List <>.为了更新UI,它需要具有某种通知机制.框架通过INotifyPropertyChanged支持此功能.您可以在数据绑定类上实现INotifyPropertyChanged,并在添加时手动更新,或使用实现它的容器.最简单的方法是用ObservableCollection <>替换List <>.

    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;
Run Code Online (Sandbox Code Playgroud)