2009-10-16 131 views
9

我可能只是在这里丢失了一些明显的东西,所以我很抱歉如果这是一个非常愚蠢的问题。我在视图中有一个WrapPanel,我需要绑定到ViewModel上的ObservableCollection。这个ObservableCollection包含一个不同类型的ViewModel,它在WrapPanel中显示时需要绑定到其他类型的视图。目标是创建一个可打包的项目列表,每个项目都通过一个应该添加到WrapPanel的较小视图实例来显示。将ObservableCollection项绑定到WrapPanel中的UserControl?

我正在使用MVVM,ViewModel没有直接访问视图。如果可能,我宁愿不在ViewModel和View之间创建绑定,因此手动向WrapPanel.Children集合添加项目不是可行的选项。我不知道如何将一组子ViewModel对象绑定到WrapPanel,这样它将创建另一个视图的实例并将它们添加到它自己。我是否错误地解决了这个问题?我认为可能有一个DataTemplate涉及,但它并不表示WrapPanel有一个DataTemplate,也不是可绑定的。

感谢您的任何见解。

+0

这听起来像你有一种情况,你有不同的viewmodels所有在同一集合。每个视图模型都有自己的关联视图。当你在一个容器中显示这些虚拟机时,你希望每个视图被包装一个额外的级别? (就像每个单独元素周围的边框一样?) – 2009-10-16 07:05:16

+0

集合包含所有相同类型,在本例中为ServiceMonitorViewModel。我只需要将它们显示在父视图的可打包容器中。 – jrista 2009-10-16 08:31:09

回答

19

你需要的是一个使用WrapPanel主办的所有项目的一个ListView。

<ListView ItemsSource={...}> 
    <ListView.ItemsPanel> 
    <ItemsPanelTemplate> 
     <WrapPanel IsItemsHost="True" /> 
    </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
     <!-- Fill in how you want each item to look here --> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 
+0

感谢您的洞察力安德鲁。我已经这样做了,并且遇到了另一个问题。我希望你也可以帮助解决这个问题,否则我会提出另一个问题。我在DataTemplate中扔了我的UserControl的。我收到以下错误:无法创建类型为“ServiceMonitorView”的实例。用户控件在默认的生成构造函数之外有零代码...所以不应该有任何构造函数代码抛出异常。 – jrista 2009-10-16 01:26:40

+0

@jrista:我会说这是一个独立的问题,属于一个独立的问题。 (我不知道答案,但我对它会是什么感兴趣) – 2009-10-16 01:52:17

14

使用一个ItemsControl,并设置其ItemsPanel到WrapPanel:

<ItemsControl ItemsSource="{Binding Something}" ItemTemplate="{StaticResource YourDataTemplate}"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <WrapPanel /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 
+0

这真是太棒了..在Silverlight的伟大工程... – Anirudha 2013-10-01 14:54:02

相关问题