WPF 隨手筆記
在WPF 裡若有多個來源 (不同的集合或Table...) 想列在一個清單裡, 除了寫程式之外, 有更簡單的方法嗎?
答案是使用CompositeCollection 類別.
- 先定義資料來源
Window.Resources定義資料來源SuperStarts是一個集合類別, HistoryHeroesData 是一個XML內容
<Window.Resources>
<c:SuperStars x:Key="SuperStartsData"/>
<XmlDataProvider x:Key="HistoryHeroesData" XPath="HistoryHeroes/Hero">
<x:XData>
<HistoryHeroes xmlns="">
<Hero Name="關公" />
<Hero Name="花木蘭" />
<Hero Name="成吉思汗" />
<Hero Name="岳飛" />
<Hero Name="文天祥" />
<Hero Name="鄭成功" />
</HistoryHeroes>
</x:XData>
</XmlDataProvider>
<DataTemplate DataType="{x:Type c:SuperStar}">
<TextBlock Text="{Binding Path=Name}" Foreground="Blue"/>
</DataTemplate>
<DataTemplate DataType="Hero">
<TextBlock Text="{Binding XPath=@Name}" Foreground="Green"/>
</DataTemplate>
</Window.Resources> - 資料繫結, 使用CompositeCollection
CompositeCollection裡使用CollectionContainer定義資料來源
<ListBox Name="myListBox" Height="300" Width="200" Background="White">
<ListBox.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{Binding Source={StaticResource SuperStartsData}}" />
<CollectionContainer Collection="{Binding Source={StaticResource HistoryHeroesData}}" />
<ListBoxItem Foreground="Red">Other Listbox Item 1</ListBoxItem>
<ListBoxItem Foreground="Red">Other Listbox Item 2</ListBoxItem>
</CompositeCollection>
</ListBox.ItemsSource></ListBox>
執行結果:
SuperStar是一個類別檔, 以下是它的原始程式:
using System.Collections.ObjectModel;
class SuperStar
{
public string Name{ get; set;}
}
class SuperStars : ObservableCollection<SuperStar>
{
public SuperStars():base() {
Add(new SuperStar() { Name = "劉德華" });
Add(new SuperStar() { Name = "張曼玉" });
Add(new SuperStar() { Name = "劉嘉玲" });
Add(new SuperStar() { Name = "梁朝偉" });
}
}
參考來源: http://msdn.microsoft.com/en-us/library/system.windows.data.compositecollection.aspx
沒有留言:
張貼留言