绑定到一组形状?

时间:2009-10-30 13:50:08

标签: c# wpf data-binding graphics mvvm

我如何绑定到一组形状?

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

MainWindow的DataContext是MainWindowViewModel

MainWindowViewModel有一个ObservableCollection形状。

我目前在MainWindow上只有一个Canvas,其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 个答案:

答案 0 :(得分:1)

您希望使用ItemsControl绑定到数据集合并拥有每个部分 由某种UI表示的数据。此外,您没有正确设置绑定。让我们从这两件事看起来如何开始:

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

注意:上面的绑定声明假设您已经将一个x:Name =“MainWindow”应用于Window元素,并且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上的标签,然后深入了解最高投票问题。