首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ListBox与全局索引的绑定

ListBox与全局索引的绑定
EN

Stack Overflow用户
提问于 2011-09-26 00:50:41
回答 2查看 440关注 0票数 1

我的应用程序有两个ObservableCollections,一个是嵌套在另一个元素中的。每个字段都包含一些字段。

ObservableCollectionA (称为列表)

  • Title
  • Description
  • Address
  • Images As MediaItems

ObservableCollectionB (称为MediaItems)

  • ImageName
  • Src
  • DisplayTime

目前,我访问ObservableCollections的方式如下:

Listings(0).MediaItems(0).ImageName

我的应用程序有主窗口显示清单中的项目,UserControl包含一个ListBox,它显示来自MediaItems的项目。

当前,我的窗口被绑定到使用New方法中的代码的列表:

代码语言:javascript
复制
Dim AppLocal As Program = Application.CurrentItem
AppLocal.CurrentItem = 0
Me.DataContext = Listings.Item(AppLocal.CurrentItem)

对于清单ObservableCollection,UserControl有一个XAML DataContext,它引用一个从嵌套的MediaItems ObservableCollection中提取记录的本地方法。

代码语言:javascript
复制
<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>

方法如下:

代码语言:javascript
复制
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将被更新。

我该怎么做?

有什么更好的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-26 09:38:55

好的,我发现了CollectionView的joy。提供了我想要的东西,而且很容易实现。我不仅惊讶于实现起来有多么容易,而且我成功地减少了比以前更多的代码行。

我实现了一个公共CollectionViewSource

代码语言:javascript
复制
Public ListingDataView As CollectionViewSource

在我的主窗口中,我将其具体如下:

代码语言:javascript
复制
<CollectionViewSource x:Key="ListingDataView" />

把我的顶级网格绑定到它上:

代码语言:javascript
复制
<Grid DataContext="{Binding Source={StaticResource ListingDataView}}">

在我的应用程序启动中,我设置了CollectionView源

代码语言:javascript
复制
AppLocal.ListingDataView = CType(Application.Current.MainWindow.Resources("ListingDataView"), CollectionViewSource)
AppLocal.ListingDataView.Source = Listings

下一个给我留下深刻印象的部分是为我的用户控件实现它。我记得UserControl是从主窗口继承的,因此它已经可以访问CollectionView了,因此我放弃了单独的类和方法绑定,而选择这样做:

代码语言:javascript
复制
<ListBox ItemsSource="{Binding Path=MediaItems}" VerticalAlignment="Top" IsSynchronizedWithCurrentItem="True" />

现在,当我想设置当前列表索引时,我简单地称之为:

代码语言:javascript
复制
AppLocal.ListingDataView.View.MoveCurrentToPosition(AppLocal.CurrentProperty)

几毫秒后,UI会自动更新。

完成了!!

票数 1
EN

Stack Overflow用户

发布于 2011-09-26 05:49:12

当您想要多个源数据(比如可观察的集合属性和可观测集合的索引)到单个目标时,应该使用MultiBinding

所以在你这种情况下应该会有帮助..。

代码语言:javascript
复制
<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.

  • Your

  • 您的数据上下文是一个类,它通过同名的属性Application保存Application对象,通过同名的属性保存Listings集合,必须实现DataContext类和Application类。它还应该引发ApplicationCurrentItem的设置通知,CurrentItem.CurrentItem CurrentItem方法返回与最终集合相同的索引值.

返回((ObservableCollection)values).Item(int.Parse(values1)) ;

假设MyListingTypeListings集合的T

这样,当任何人更改全局Application.CurrentItem.CurrentItem时,上面的多个绑定将被通知并选择所需的Listings项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7549687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档