【问题标题】:Recommended way to execute code when CollectionView.SourceCollection changes当 CollectionView.SourceCollection 改变时执行代码的推荐方式
【发布时间】:2011-11-03 14:49:51
【问题描述】:

我有一个 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 类型,但我无法弄清楚如何继续。

任何意见将不胜感激!

【问题讨论】:

    标签: wpf events collectionview


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我正在研究这种方法,但遇到了几个问题:
    • 谢谢,我正在研究这种方法,但遇到了几个问题。 1:如果我连接到 View 或 SourceCollection 上的 CollectionChanged 事件,则 CollectionChanged 事件的 sender 参数将是视图或集合。但我需要访问 DisplayControl 对象来执行重新定位! 2:当项目的属性发生变化时,CollectionChanged 不会触发。
    【解决方案2】:

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

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

    【讨论】:

    • 排序不够;项目的排列是二维的,取决于项目的几个属性。我最终做了你所描述的事情来获取有关项目属性更改的通知,但我仍然遇到从作为发送者传递给事件处理程序的 CollectionView/ObservableCollection 获取对我的控件的引用的问题。目前,我使用将 CollectionView 映射到控件的静态字典。但这不是一个非常强大的解决方案。我将非常感谢有关如何改进这一点的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2013-10-16
    • 2017-09-20
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多