HI! 我想设计一个包含不同位置的多个对象的视图。例如 - 如果viewmodel可以包含像对象列表(矩形)这样的字段,当我将成员更改/添加到列表时,新的矩形会出现在指定位置的视图中,这将是很棒的。 我如何创建这样的view / viewmodel?
答案 0 :(得分:6)
您可以在ViewModel中拥有ICollectionView
或ObservableCollection<T>
属性,并将ItemsSource
的{{1}}属性绑定到此属性。然后,这将显示集合中的所有项目(视图)。但是,它通常会在ItemsControl
中显示它们,因为这是StackPanel
的默认项容器。据我了解您的问题,您希望将项目放在屏幕上的任何位置。这可以通过使用ItemsControl
作为Canvas
的{{1}}来完成,然后将ItemsControl
和ItemsPanel
属性绑定到ViewModel中的属性。当然,每个项目都需要Canvas.Left
和Canvas.Top
属性(也可能是Left
和Top
属性。)
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 collection的Canvas
。我从我的一个应用程序复制并粘贴了上面的代码,因此可能会出现一些不一致的原因,因为我们会根据您的场景快速调整属性。但是,我认为原则应该是明确的。祝你好运!
答案 1 :(得分:2)
接受答案的一个问题是Canvas.Left / Top绑定不起作用,因为Rectangle由ItemsControl包装在容器控件中。另一个问题解决了这个问题: Setting Canvas properties in an ItemsControl DataTemplate
希望这有助于其他人,因为我正在屏幕上敲打着想知道为什么这不起作用。