嘿所有,我正在用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代码,它只是达到目的的手段,我只是想让元素在此刻动态更新。此外,我可能会以错误的方式接近这一点,如果有更好的方法从模板动态添加屏幕上的元素,那么听到它们会非常有帮助。
谢谢大家。
答案 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;