在CollectionView.SourceCollection更改时执行代码的推荐方法

时间:2011-11-03 14:49:52

标签: wpf events collectionview

我有一个ObservableCollection项目,我想同时在两个控件中显示:一个用于编辑当前选择的属性,添加和删除项目,另一个用于显示整个集合,并突出显示当前选择。

为此,我创建了一个CollectionViewSource,它绑定到我的项目,并绑定到我的控件中:

<UserControl>
  <UserControl.Resources>
    <CollectionViewSource x:Key="MyCollectionViewSource" Source="{Binding MyItems}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="MyProperty" />
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
  </UserControl.Resources>

  <Grid>
    <my:PropertiesControl TheItems="{Binding Source={StaticResource MyCollectionViewSource}}" >
    <my:DisplayControl TheItems="{Binding Source={StaticResource MyCollectionViewSource}}" >
  </Grid>
</UserControl>

问题是在DisplayControl中我想以一种无法通过XAML指定的特殊方式排列项目:项目的位置不仅取决于它自己的属性,还取决于集合中其他项目的属性。 。因此,每当在集合中添加或删除项目时,或者当集合中某个项目的属性发生更改时,我都需要执行一些重新定位代码。

我想知道,推荐的方法是什么?受ItemsControl.ItemsSource的启发,我正在考虑使TheItems属性的类型为IEnumerable,但我无法弄清楚如何继续。

任何输入将不胜感激!

2 个答案:

答案 0 :(得分:0)

在您的显示控件的代码隐藏中,我假设是您自己创建的自定义控件,您可以获取“TheItems”并将它们重新排序到您的内容......因为您使用的是ObservableCollection,您可以“附加” “到CollectionChanged事件并检查条件(请参阅传入的事件参数),添加/删除新项目并在此时重新排序。

答案 1 :(得分:0)

您是否已经使用MyProperty实施了排序?为什么你不能使用Myproperty来保存一些计算的顺序,这些顺序可以在添加/删除/编辑项目时对这些项目进行唯一排序。

我的意思是从模型的角度来看,当您添加和删除项目(使用ObservableCollection.CollectionChanged处理程序)或编辑(使用INotifyPropertyChanged.PropertyChanged处理程序时,您总是知道列表)。因此,当您处理这些事件时,您必须更新您的MyProperty,它将为每个项目保留价值,以便按照您预期的逻辑进行重新排序。