2011-09-26 49 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