WPF ListBox项目的对齐和顺序?

时间:2016-06-08 12:45:02

标签: c# wpf listbox

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

  • item1,index 1
  • item2,index 2
  • item3,index 4

列表框:

  • ITEM1
  • ITEM2
  • 空白区域
  • 项目3

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

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

1 个答案:

答案 0 :(得分:1)

执行此MVVM,您的列表框项目将是您自己的某些类的ObservableCollection个实例,它代表您在列表框中放置的任何内容(用户,二手车等)。该集合是您的viewmodel上的属性。

在事件ListBox结束时,您必须使用间隔项表示空插槽 - null应该没问题。然后,您可以使用列表框ItemTemplateItemContainerStyle在视图中执行某些操作,以显示"空的"项目正确并防止用户选择它们。您可能必须处理SelectionChanged事件才能实现这一目标;如果你想以通用的方式重用这些东西,你可以通过你的样式应用的附加属性来处理SelectionChanged

选项1,不是最纯粹的MVVM,而是比“正确行动”少得多的工作,非常简单:当您填充ObservableCollection时,对项目进行排序并为空间项目插入空值。完成。

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

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

选项2,如果你想要完整的MVVMtard并建立年龄:

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

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

我不希望viewmodel有关于ListBoxes的任何线索,甚至是关于空项目的任何线索。

我会给viewmodel一个gappy集合&#34;非空&#34; items,并编写一个CollectionViewSource子类,它将按你喜欢的任何属性排序,并另外将该集合投射到另一个readonly集合,其中包括null&#34; spacer&#34;它在View属性中公开的项目。

防过滤器的种类。它可以使用SortDescriptions来定义差距,至少如果您按整数排序。或者你可以通过给它一个keyselector lambda或类似于现有Filter event的事件来半快速和脏的那部分。

CollectionViewSource.View不是虚拟财产,但它是DependencyProperty。应该有一些方法可以在那里放一个铃声。如果这给您带来任何麻烦,请改用CollectionView