2008-11-04 142 views
3

我試圖使用MultiBinding作爲ListBox的ItemsSource,並且我想將一些集合綁定到MultiBinding。只有在主機控件(派生頁面)已經實例化之後,集合纔會被填充。在構建之後,我會調用一個爲頁面設置一些數據的方法,包括這些集合。綁定動態資源

現在,我有這樣的事情:

public void Setup() 
{ 
    var items = MyObject.GetWithID(backingData.ID); // executes a db query to populate collection 
    var relatedItems = OtherObject.GetWithID(backingData.ID); 
} 

,我希望做這樣的事情在XAML:

<Page ... 

    ... 

    <ListBox> 
     <ListBox.ItemsSource> 
      <MultiBinding Converter="{StaticResource converter}"> 
       <Binding Source="{somehow get items}"/> 
       <Binding Source="{somehow get relatedItems}"/> 
      </MultiBinding> 
     </ListBox.ItemsSource> 
    </ListBox> 
    ... 
</Page> 

我知道我不能在綁定使用DynamicResource,所以我能做什麼?

回答

4

聽起來像我真正想要的是CompositeCollection併爲您的頁面設置DataContext。

<Page x:Class="MyPage" DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <Page.Resources> 
     <CollectionViewSource Source="{Binding Items}" x:Key="items" /> 
     <CollectionViewSource Source="{Binding RelatedItems}" x:Key="relatedItems" /> 
    </Page.Resources> 

    <ListBox> 
     <ListBox.ItemsSource> 
     <CompositeCollection> 
      <CollectionContainer 
      Collection="{StaticResource items}" /> 
      <CollectionContainer 
      Collection="{StaticResource relatedItems}" /> 
     </CompositeCollection> 
     </ListBox.ItemsSource> 
    </ListBox> 
</Page> 

後面的代碼會是這個樣子:

public class MyPage : Page 
{ 
    private void Setup() 
    { 
     Items = ...; 
     RelatedItems = ...; 
    } 

    public static readonly DependencyProperty ItemsProperty = 
     DependencyProperty.Register("Items", typeof(ReadOnlyCollection<data>), typeof(MyPage),new PropertyMetadata(false)); 
    public ReadOnlyCollection<data> Items 
    { 
     get { return (ReadOnlyCollection<data>)this.GetValue(ItemsProperty); } 
     set { this.SetValue(ItemsProperty , value); } 
    } 

    public static readonly DependencyProperty RelatedItemsProperty = 
     DependencyProperty.Register("RelatedItems", typeof(ReadOnlyCollection<data>), typeof(MyPage),new PropertyMetadata(false)); 
    public ReadOnlyCollection<data> RelatedItems 
    { 
     get { return (ReadOnlyCollection<data>)this.GetValue(RelatedItemsProperty); } 
     set { this.SetValue(RelatedItemsProperty , value); } 
    } 
} 

編輯:我記得CollectionContainer不參與邏輯樹,所以你需要使用一個CollectionViewSource和靜態資源。