WPF MVVM使用不同数量的对象查看。如何?

时间:2010-06-02 11:23:17

标签: c# wpf mvvm

HI! 我想设计一个包含不同位置的多个对象的视图。例如 - 如果viewmodel可以包含像对象列表(矩形)这样的字段,当我将成员更改/添加到列表时,新的矩形会出现在指定位置的视图中,这将是很棒的。 我如何创建这样的view / viewmodel?

2 个答案:

答案 0 :(得分:6)

您可以在ViewModel中拥有ICollectionViewObservableCollection<T>属性,并将ItemsSource的{​​{1}}属性绑定到此属性。然后,这将显示集合中的所有项目(视图)。但是,它通常会在ItemsControl中显示它们,因为这是StackPanel的默认项容器。据我了解您的问题,您希望将项目放在屏幕上的任何位置。这可以通过使用ItemsControl作为Canvas的{​​{1}}来完成,然后将ItemsControlItemsPanel属性绑定到ViewModel中的属性。当然,每个项目都需要Canvas.LeftCanvas.Top属性(也可能是LeftTop属性。)

Width

你的XAML:

Height

在最后一步中,您可能希望public class ItemViewModel { public double Left { get; set; } public double Top { get; set; } public double Width { get; set; } public double Height { get; set; } // whatever you need... } public class CollectionViewModel { public ObservableCollection<ItemViewModel> Collection { get; } // some code which fills the Collection with items } <ItemsControl ItemsSource="{Binding Collection}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Canvas/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate DataType="{x:Type local:ItemViewModel}"> <Rectangle Width="{Binding Width}" Height="{Binding Height}" Canvas.Left="{Binding Left}" Canvas.Top="{Binding Top}"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> 属性相对于Left的大小,以便项目保持在相对位置(如果大小) Top更改。这还有一些工作:

Canvas

代码的描述已在XAML注释中。但是,我应该注意到我使用了来自Kent Boogart's Converter collectionCanvas。我从我的一个应用程序复制并粘贴了上面的代码,因此可能会出现一些不一致的原因,因为我们会根据您的场景快速调整属性。但是,我认为原则应该是明确的。祝你好运!

答案 1 :(得分:2)

接受答案的一个问题是Canvas.Left / Top绑定不起作用,因为Rectangle由ItemsControl包装在容器控件中。另一个问题解决了这个问题: Setting Canvas properties in an ItemsControl DataTemplate

希望这有助于其他人,因为我正在屏幕上敲打着想知道为什么这不起作用。