2011-09-26 58 views
1

我的應用程序有一對ObservableCollections,它嵌套在另一個的元素中。每個包含許多字段,例如ListBox與全局索引綁定

ObservableCollectionA(稱爲人數)

  • 標題
  • 說明
  • 地址
  • 圖像爲MediaItems

ObservableCollectionB(稱爲MediaItems)

  • ImageName
  • 的Src
  • DisplayTime

目前,我已經訪問ObservableCollections如下:

Listings(0).MediaItems(0).ImageName

我的應用程序的主窗口中顯示從清單中的項目和一個用戶控件,其包含一個顯示MediaItems項目的ListBox。

目前我的窗口,勢必在新的方法中使用代碼編目:

Dim AppLocal As Program = Application.CurrentItem 
AppLocal.CurrentItem = 0 
Me.DataContext = Listings.Item(AppLocal.CurrentItem) 

對於房源的ObservableCollection,用戶控件有一個XAML的DataContext它引用從嵌套MediaItems的ObservableCollection拉記錄的本地方法。

<UserControl.DataContext> 
    <ObjectDataProvider ObjectType="{x:Type local:ThumbImageLoader}" MethodName="LoadImagesv2" IsAsynchronous="True" /> 
</UserControl.DataContext> 
<Grid x:Name="ThumbListBoxGrid"> 
    <ListBox x:Name="ThumbListBox" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" /> 
</Grid> 

的方法是在這裏:

Public NotInheritable Class ThumbImageLoader 
Public Shared Function LoadImagesv2() As List(Of MediaItems) 

    Dim AppLocal As Program = Application.Current 

    Dim ThumbImages As New List(Of MediaItems) 

    ThumbImages = Listings(AppLocal.CurrentItem).MediaItems 

    Return ThumbImages 
End Function 
End Class 

雖然開發UI佈局我剛纔已裝訂的第一項(0指數)。我現在希望能夠從應用程序中的任何位置設置AppLocal.CurrentItem,以便更新Window和ListBox。

理想情況下,我希望它在全局屬性索引更改時更新UI。

我該怎麼做?

有沒有更好的方法去解決它?

回答

1

好吧,我發現了CollectionView的喜悅。正好提供了我之後的內容,並且非常容易實施。我被吹走了,不僅實現起來有多容易,而且我設法削減了比我實現它更多的代碼行。

我實現了一個公共CollectionViewSource

Public ListingDataView As CollectionViewSource 

在我的主窗口中,我Implemeted一個,如下所示:

<CollectionViewSource x:Key="ListingDataView" /> 

,並結合我的頂級網格它:

<Grid DataContext="{Binding Source={StaticResource ListingDataView}}"> 

在我的應用程序啓動中,我設置了CollectionView源代碼

AppLocal.ListingDataView = CType(Application.Current.MainWindow.Resources("ListingDataView"), CollectionViewSource) 
AppLocal.ListingDataView.Source = Listings 

下一部分給我印象最深的是爲我的用戶控件實現它。我想起了用戶控件從主窗口,以便它可以訪問的CollectionView已經繼承,所以我拋棄了單獨的類和方法贊成這種結合:

<ListBox ItemsSource="{Binding Path=MediaItems}" VerticalAlignment="Top" IsSynchronizedWithCurrentItem="True" /> 

現在whene我想設置當前的列表索引,我簡單地稱之爲:

AppLocal.ListingDataView.View.MoveCurrentToPosition(AppLocal.CurrentProperty) 

幾毫秒後,UI自動更新。

完成!

0

當你想多源數據(如您的觀察的集合屬性和觀察集合索引)你應該使用MultiBinding一個目標。

因此,在這樣的情況下,你應該somethign幫助...

<ListBox x:Name="ThumbListBox" IsSynchronizedWithCurrentItem="True" > 
    <ListBox.ItemsSource> 
     <MultiBinding Converter="{StaticResource CollectionAndIndexCollaborator}"> 
      <Binding Path="Listings" /> 
      <Binding Path="Application.CurrentItem.CurrentItem" /> 
     </MultiBinding> 
    </ListBox.ItemsSource> 
</ListBox> 

提供....

  1. 你的數據上下文是一些類,通過經由同名Listings的屬性同名Application的屬性和Listings集合保存Application對象。
  2. 您的DataContext類和Application類必須有INotifyPropertyChanged實施。它還應該通知Application和安裝程序CurrentItemCurrentItem.CurrentItem屬性。
  3. CollectionAndIndexCollaborator.Convert()方法返回相同的索引值作爲最終的收集....

    回報((的ObservableCollection)值[0])項目(int.Parse(值[1]));

這裏假設MyListingType是您的收藏ListingsT

這樣當改變全球Application.CurrentItem.CurrentItem多結合上面會得到通知,並選擇所需的Listings項目。

+0

感謝您的建議AngelWPF - 我最終以略有不同的東西去。我會很快發佈結果。 – Ben