【问题标题】:WPF ListBox items alignment and in order?WPF ListBox 项目的对齐方式和顺序?
【发布时间】:2016-10-08 17:52:22
【问题描述】:

是否可以用具有预定义索引的项目填充列表框? 例如,如果我有具有索引值的项目集合:

  • item1,索引 1
  • item2,索引 2
  • 项目 3,索引 4

列表框:

  • 项目1
  • 项目2
  • 空白空间
  • 项目3

列表可以包含任意数量的空位或填充位置的组合。

哪种方法是在 WPF 环境中使用 MVVM 结构实现预期结果的最直接方法?

【问题讨论】:

  • 创建具有两个属性itemindex的模型类,但在ListBox中按顺序添加项目
  • 将 ListBox 的 ItemsSource 绑定到一个集合,其中包含 null 的空白项。

标签: c# wpf listbox


【解决方案1】:

完全执行此 MVVM,您的列表框项目将是您自己的某个类的实例的ObservableCollection,它代表您放入列表框中的任何内容(用户、二手车等)。该集合是您的视图模型上的一个属性。

ListBox 结束时,您必须用间隔项表示空槽——null 应该可以。然后,您将在视图中使用 ListBox 的ItemTemplateItemContainerStyle 来正确显示“空”项并防止它们被用户选中。您可能必须处理SelectionChanged 事件才能实现;如果你想以一种通用的方式重用这些东西,你可以通过你的样式将应用的附加属性来处理SelectionChanged

选项 1,不是最纯粹的 MVVM,但比 Doing It Right 少了很多工作,非常简单:当您填充 ObservableCollection 时,对项目进行排序并为间隔项目插入空值。完毕。

<ListBox 
    ItemsSource="{Binding WeirdGappyCollectionWithNulls}" 
    ItemTemplate="{StaticResource GappyItemTemplate}"
    ItemContainerStyle="{StaticResource GappyItemContainerStyle}"
    />

...其中GappyItemTemplateGappyItemContainerStyle 在上面的ResourceDictionary 中定义。

选项 2,如果您想使用 Full MVVMtard 并为年龄构建:

对于排序,我通常使用已排序的CollectionViewSource。然后你将它绑定到 ItemsSource

<ListBox 
    ItemTemplate="{StaticResource GappyItemTemplate}"
    ItemContainerStyle="{StaticResource GappyItemContainerStyle}"
    >
    <ListBox.ItemsSource>
        <local:GappyCollectionViewSource
            Source="{Binding GappyCollection}"
            ...etc. etc.
            />
    </ListBox.ItemsSource>
</ListBox>

我不希望视图模型有任何关于 ListBox 的线索,甚至是关于空项目的线索。

我会给视图模型一个“非空”项目的间隙集合,并编写一个CollectionViewSource 子类,该子类将按您喜欢的任何属性进行排序,并将该集合投影到另一个包含空“间隔”的只读集合项目,它在其View 属性中公开。

一种反过滤器。它可以使用SortDescriptions 来定义间隙是什么,至少在您按整数排序的情况下。或者,您可以通过给它一个 keyselector lambda 或类似于现有 Filter event 的事件来半快速和肮脏地完成该部分。

CollectionViewSource.View 不是虚拟属性,但它是DependencyProperty。应该有某种方法可以在那里滑入铃声。如果这给您带来任何麻烦,请改用CollectionView 重新开始。

【讨论】:

  • 使用attached behaviour approach 怎么样?比如listBox上的每一项都包含索引。
  • 或作为一种混合行为?
  • @ajr 你的意思是应用到ListBox 的附加属性,当集合更改时将填充虚拟项目,并在ListBoxItem 实例上放置附加索引属性?除了所有的工作,我预计它会与虚拟化发生冲突(当实际上只有 20 个 ListBoxItems 存在时,你如何对 200 个 ListBoxItems 的集合进行排序?)。无论如何,我不知道您将如何对 ListBoxItems 进行排序。这可能是可行的,但根据我的经验,这种事情从来都不是 WPF 阻力最小的途径。
  • 诚然,这种方法会影响性能。感谢您的洞察力!我决定使用 选项 1,在第一次创建集合时将值插入正确的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2021-07-15
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多