动态更新DataTemplate的源代码

时间:2011-05-10 00:36:57

标签: c# silverlight xaml windows-phone-7 datatemplate

嘿所有,我正在用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>

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

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

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

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

谢谢大家。

1 个答案:

答案 0 :(得分:5)

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

    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;