2

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

任何输入将不胜感激!

4

2 回答 2

0

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

于 2011-11-03T14:56:05.507 回答
0

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

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

于 2011-11-04T08:51:51.757 回答