当我用当前的应用程序敲除越来越多的MVVM相关问题时,更多的只是不断弹出。 :)
我想要替换的当前实现涉及一个StackPanel,其子项或多或少是动态生成的(通过查看配置文件)。每个子节点都是UserControl的一个实例。之前,我所做的是为StackPanel分配一个名称,然后在Window_Loaded事件处理程序中,我只需确定必要的子项数,为每个子实例化一个UserControl,并为UserControl分配一个ID,这样我就知道了单击特定UserControl实例的按钮的正确来源;每个UserControl上都有3个按钮。
所以我知道我想将StackPanel绑定到一个集合。这当然是不可能的,因为我需要使用从ItemsControl派生的东西,比如ListBox或ListView(甚至ItemsControl本身)。为了在MVVM-ifying的第一次迭代中保持简单,我将只使用ListBox。
现在的问题是,代码隐藏中的ObservableCollection应该是一个ObservableCollection吗?我相信这意味着无论我如何为我的GUI设置外观,这个ListBox总是会有孩子看起来像他们在MyUserControl的XAML文件中那样。我希望这也可以自定义,但我认为这意味着我必须将MVVM模式应用于UserControl。
答案 0 :(得分:5)
如果您希望每个列表项都有不同的模板,并希望坚持MVVM风格,那么最好不要考虑UserControls。
您可以让主视图将ListBox绑定到可观察的View Model实例集合。如果您设置数据模板以将ViewModel类映射到其相应的UserControl,则无需显式加载UserControls - 只需将任何ItemsControl绑定到您的ViewModel集合,并让数据模板负责构建并将其映射到该VM的正确UserControl。
答案 1 :(得分:1)
如果您不需要,您的收藏品不必是ObservableCollection
。 ObservableCollection
的“可观察”部分只是提供事件以通知其他人集合已经改变,它与视觉表示无关。
ObservableCollection
非常适合MVVM,因为它提供了所有事件通知,但最终,无论您使用List<T>
还是ObservableCollection<T>
都不会影响事物的显示方式在任何给定的时间点视觉上。