2008年10月31日 星期五

繫結多個不同的集合

WPF 隨手筆記

在WPF 裡若有多個來源 (不同的集合或Table...) 想列在一個清單裡, 除了寫程式之外, 有更簡單的方法嗎?

答案是使用CompositeCollection 類別.

  1. 先定義資料來源

    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>


  2. 資料繫結, 使用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

沒有留言:

張貼留言