我的应用程序有几个ObservableCollections,一个嵌套在另一个元素中。每个都包含许多字段,例如
ObservableCollectionA(称为列表)
ObservableCollectionB(称为MediaItems)
目前我一直在访问ObservableCollections,如下所示:
Listings(0).MediaItems(0).ImageName
我的应用程序让主窗口显示来自Listings的项目和一个UserControl,其中包含一个显示MediaItems项目的ListBox。
目前,我的Window使用New方法中的代码绑定到列表:
Dim AppLocal As Program = Application.CurrentItem
AppLocal.CurrentItem = 0
Me.DataContext = Listings.Item(AppLocal.CurrentItem)
对于Listing ObservableCollection,UserControl有一个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会更新。
我该怎么做?
有没有更好的方法呢?
本
答案 0 :(得分:1)
好的,我发现了CollectionView的乐趣。提供我正在追求的东西,并且非常容易实现。我不仅对实施起来有多么容易感到震惊,而且还设法删除了比实现它更多的代码行。
我实现了一个公共的CollectionViewSource
Public ListingDataView As CollectionViewSource
在我的主窗口中,我按如下方式实现:
<CollectionViewSource x:Key="ListingDataView" />
并将我的顶级网格绑定到它:
<Grid DataContext="{Binding Source={StaticResource ListingDataView}}">
在我的应用程序启动中,我设置了CollectionView Source
AppLocal.ListingDataView = CType(Application.Current.MainWindow.Resources("ListingDataView"), CollectionViewSource)
AppLocal.ListingDataView.Source = Listings
给我留下最深刻印象的下一部分是为我的用户控件实现它。我记得UserControl是从主窗口继承的,所以它已经可以访问CollectionView了,所以我抛弃了单独的Class和Method绑定,为此支持:
<ListBox ItemsSource="{Binding Path=MediaItems}" VerticalAlignment="Top" IsSynchronizedWithCurrentItem="True" />
现在我想设置当前列表索引,我只需要这样说:
AppLocal.ListingDataView.View.MoveCurrentToPosition(AppLocal.CurrentProperty)
几毫秒后,UI会自动更新。
完成!!
答案 1 :(得分:0)
当您需要多个源数据(如可观察集合属性和可观察集合的索引)到单个目标时,您应该使用MultiBinding
。
所以在你的情况下,像这样的某些人应该有所帮助...
<ListBox x:Name="ThumbListBox" IsSynchronizedWithCurrentItem="True" >
<ListBox.ItemsSource>
<MultiBinding Converter="{StaticResource CollectionAndIndexCollaborator}">
<Binding Path="Listings" />
<Binding Path="Application.CurrentItem.CurrentItem" />
</MultiBinding>
</ListBox.ItemsSource>
</ListBox>
提供....
Application
和Application
集合通过同名属性Listings
保存Listings
对象的类。Application
类必须已实现INotifyPropertyChanged
。它还应该针对Application
和Setter of CurrentItem
和CurrentItem.CurrentItem
属性发出通知。 CollectionAndIndexCollaborator.Convert()
方法返回与最终集合相同的索引值....
return((ObservableCollection)values [0])。Item(int.Parse(values [1]));
假设MyListingType
是T
集合的Listings
。
这样,当任何人更改全局Application.CurrentItem.CurrentItem
时,上面的多重绑定会收到通知,并会选择所需的Listings
项。