2009-10-30 41 views
0

我将如何绑定到一组形状?绑定到一组形状?

我想建立一个小型应用程序(仅用于学习目的),我利用MVVM绘制形状。

的主窗口的DataContext的是MainWindowViewModel

即MainWindowViewModel具有形状的一个ObservableCollection。

我目前只能在我的主窗口与它的DataContext绑定到该集合的画布不工作:

<Window x:Class="DesktopCanvas.MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
> 
    <Canvas DataContext="{Binding Source=ShapeCollection}"> 
    </Canvas> 
</Window> 

在MainWindowViewModel的构造我添加一个矩形这样的:

this.ShapeCollection = new ObservableCollection<Shape>(); 
Rectangle rect = new Rectangle(); 
//Größe 
rect.Height = 75; 
rect.Width = 75; 
//Transparenz 
rect.Opacity = 100; 
//Farbe 
SolidColorBrush myBrush = new SolidColorBrush(Colors.Red); 
rect.Fill = myBrush; 
this.ShapeCollection.Add(rect); 

目前没有绑定错误。有任何想法吗?

回答

1

你想要使用一个ItemsControl绑定到一个数据集合,并让每个数据块 由某种类型的UI表示。另外,你没有正确设置绑定。让我们先从这两个东西的外观:

<ItemsControl ItemsSource="{Binding Path=ShapeCollection, Element=MainWindow}"> 
</ItemsControl> 

注:上述约束力的声明假定您已经应用了X:NAME =“主窗口”你的窗口元素,而且ShapeCollection是一个属性关闭你的MainWindow类。

现在,由于ItemsControl的默认布局是一个垂直方向的StackPanel,因此您应该可以看到您的形状堆叠在一起。如果你想改变元素的布局,你可以改变ItemsControl的ItemPanelTemplate。让我们改变它,以便形状水平放置,并在空间耗尽时垂直包裹:

<ItemsControl Height="100" ItemsSource="{Binding ShapeCollection, ElementName=Window, Mode=Default}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

最后我们来谈谈您的整体方法。现在你实际上使用Shapes作为你的数据,这实际上是从一种称为Mode-View-ViewModel(MVVM)的技术稍微向后的。在MVVM中,您只需要一个纯数据对象,然后您或者更好的是您的设计人员使用DataTemplates定义该数据的可视表示。有关MVVM的更多信息,我建议您只需点击StackOverflow上的标签并挖掘最高投票的问题即可。