2011-05-10 30 views
1

嘿,我正在用Silverlight編寫windows phone應用程序,並且我試圖動態更新我已有的DataTemplate的源代碼。下面是我有XAML:動態更新DataTemplate的源代碼

<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代碼,只是一種手段,我只是想獲得元素動態更新。另外,如果有更好的方法從模板動態添加屏幕上的元素,那麼我可能會以錯誤的方式處理這個問題,這對聽到它們非常有幫助。

謝謝大家。

回答

5

您沒有說明什麼類型的列表,但我將假設它是一個普通列表<>。爲了更新UI,它需要有某種通知機制。該框架通過INotifyPropertyChanged支持這一點。您可以在數據綁定類上實現INotifyPropertyChanged,並在添加時手動更新,或使用實現它的容器。最簡單的方法是用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; 
+0

你是男性中的半神人。古代文明在預言你的智慧時建造了雕像。你屬於Neil Bohr旁邊的照片:http://en.wikipedia.org/wiki/Solvay_Conference#Fifth_conference。 「爲何你偏偏是羅密歐?」並不是羅密歐對蒙塔古斯忠誠的問題,而是朱麗葉渴望羅米歐像你一樣有幫助,聰明和英俊的渴望。謝謝里奇梅爾頓。 – jjcm 2011-05-10 18:57:48