是否可以使用具有预定义索引的项填充listBox? 例如,如果我有索引值的项目集合:
列表框:
列表可以包含任意数量的空位或填充位置组合。
哪种方法是在WPF环境中使用MVVM结构实现所需结果的最直接方法?
答案 0 :(得分:1)
执行此MVVM,您的列表框项目将是您自己的某些类的ObservableCollection
个实例,它代表您在列表框中放置的任何内容(用户,二手车等)。该集合是您的viewmodel上的属性。
在事件ListBox
结束时,您必须使用间隔项表示空插槽 - null
应该没问题。然后,您可以使用列表框ItemTemplate
和ItemContainerStyle
在视图中执行某些操作,以显示"空的"项目正确并防止用户选择它们。您可能必须处理SelectionChanged
事件才能实现这一目标;如果你想以通用的方式重用这些东西,你可以通过你的样式应用的附加属性来处理SelectionChanged
。
选项1,不是最纯粹的MVVM,而是比“正确行动”少得多的工作,非常简单:当您填充ObservableCollection
时,对项目进行排序并为空间项目插入空值。完成。
<ListBox
ItemsSource="{Binding WeirdGappyCollectionWithNulls}"
ItemTemplate="{StaticResource GappyItemTemplate}"
ItemContainerStyle="{StaticResource GappyItemContainerStyle}"
/>
...其中GappyItemTemplate
和GappyItemContainerStyle
在上面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
。