我的应用程序有两个ObservableCollections,一个是嵌套在另一个元素中的。每个字段都包含一些字段。
ObservableCollectionA (称为列表)
ObservableCollectionB (称为MediaItems)
目前,我访问ObservableCollections的方式如下:
Listings(0).MediaItems(0).ImageName
我的应用程序有主窗口显示清单中的项目,UserControl包含一个ListBox,它显示来自MediaItems的项目。
当前,我的窗口被绑定到使用New方法中的代码的列表:
Dim AppLocal As Program = Application.CurrentItem
AppLocal.CurrentItem = 0
Me.DataContext = Listings.Item(AppLocal.CurrentItem)对于清单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,以便更新窗口和ListBox。
理想情况下,我希望这样,当全局属性索引发生变化时,UI将被更新。
我该怎么做?
有什么更好的方法吗?
本
发布于 2011-09-26 09:38:55
好的,我发现了CollectionView的joy。提供了我想要的东西,而且很容易实现。我不仅惊讶于实现起来有多么容易,而且我成功地减少了比以前更多的代码行。
我实现了一个公共CollectionViewSource
Public ListingDataView As CollectionViewSource在我的主窗口中,我将其具体如下:
<CollectionViewSource x:Key="ListingDataView" />把我的顶级网格绑定到它上:
<Grid DataContext="{Binding Source={StaticResource ListingDataView}}">在我的应用程序启动中,我设置了CollectionView源
AppLocal.ListingDataView = CType(Application.Current.MainWindow.Resources("ListingDataView"), CollectionViewSource)
AppLocal.ListingDataView.Source = Listings下一个给我留下深刻印象的部分是为我的用户控件实现它。我记得UserControl是从主窗口继承的,因此它已经可以访问CollectionView了,因此我放弃了单独的类和方法绑定,而选择这样做:
<ListBox ItemsSource="{Binding Path=MediaItems}" VerticalAlignment="Top" IsSynchronizedWithCurrentItem="True" />现在,当我想设置当前列表索引时,我简单地称之为:
AppLocal.ListingDataView.View.MoveCurrentToPosition(AppLocal.CurrentProperty)几毫秒后,UI会自动更新。
完成了!!
发布于 2011-09-26 05:49:12
当您想要多个源数据(比如可观察的集合属性和可观测集合的索引)到单个目标时,应该使用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>前提是..。
Listings.
Application保存Application对象,通过同名的属性保存Listings集合,必须实现DataContext类和Application类。它还应该引发Application和CurrentItem的设置通知,CurrentItem.CurrentItem CurrentItem方法返回与最终集合相同的索引值.返回((ObservableCollection)values).Item(int.Parse(values1)) ;
假设MyListingType是Listings集合的T。
这样,当任何人更改全局Application.CurrentItem.CurrentItem时,上面的多个绑定将被通知并选择所需的Listings项。
https://stackoverflow.com/questions/7549687
复制相似问题