ListBox绑定全局索引

时间:2011-09-26 00:50:41

标签: wpf binding listbox

我的应用程序有几个ObservableCollections,一个嵌套在另一个元素中。每个都包含许多字段,例如

ObservableCollectionA(称为列表)

  • 标题
  • 描述
  • 地址
  • 图像为MediaItems

ObservableCollectionB(称为MediaItems)

  • ImageName
  • 的Src
  • DisplayTime

目前我一直在访问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会更新。

我该怎么做?

有没有更好的方法呢?

2 个答案:

答案 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>

提供....

  1. 您的数据上下文是通过同名属性ApplicationApplication集合通过同名属性Listings保存Listings对象的类。
  2. 您的DataContext类和Application类必须已实现INotifyPropertyChanged。它还应该针对Application和Setter of CurrentItemCurrentItem.CurrentItem属性发出通知。
  3. CollectionAndIndexCollaborator.Convert()方法返回与最终集合相同的索引值....

    return((ObservableCollection)values [0])。Item(int.Parse(values [1]));

  4. 假设MyListingTypeT集合的Listings

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