将集合绑定到Grid

时间:2014-09-17 09:43:50

标签: c# wpf collections

我有一个名为Fly的对象,它具有属性Position(Point)和Orientation(double)。 在我的MainViewModel中,我有一个名为Fly的自定义对象Flies的集合。

苍蝇的视图是.png图像。我想将Flies绑定到MainWindow中的Grid,使用其属性PositionOrientation来显示屏幕上的苍蝇。

我以前从未对这个系列做过这种绑定。我之前做的是将集合绑定到ListBoxItemsControl

        <ItemsControl ItemsSource="{Binding MyCollection}">
        <ItemsControl.Template>
            <ControlTemplate>
                <ScrollViewer>
                    <ItemsPresenter/>
                </ScrollViewer>
            </ControlTemplate>
        </ItemsControl.Template>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <local:ItemView/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>

如何将我的对象绑定到网格或任何其他控件以便能够显示正确的位置和角度方向?

2 个答案:

答案 0 :(得分:1)

基于这里问题的一些假设,你正在寻找什么

<ItemsControl ItemsSource="{Binding MyCollection}">
    <ItemsControl.Resources>
        <Style TargetType="ContentPresenter">
            <Setter Property="Canvas.Left"
                    Value="{Binding Position.X}" />
            <Setter Property="Canvas.Top"
                    Value="{Binding Position.Y}" />
            <Setter Property="RenderTransform">
                <Setter.Value>
                    <RotateTransform Angle="{Binding Orientation}" />
                </Setter.Value>
            </Setter>
        </Style>
    </ItemsControl.Resources>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <local:ItemView />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

我做了什么

  • 将Canvas设置为ItemsControl的ItemsPanel,它将托管项目(苍蝇)
  • 创建了一个定位ContentPresenter的样式,该样式是ContentPresenter中项目的默认主机。
  • 将Canvas.Left&amp; Canvas.Top到各自位置的X&amp; ÿ
  • 为方向添加了RotateTransform,并将角度绑定到Orientation属性。

我可以假设苍蝇应该飞,所以在这种情况下你可能想要改变X&amp; Y会改变飞行位置。但由于Point类不通知子属性的更改,因此绑定可能无法按预期工作。因此,作为建议,您可能希望使用属性更改通知创建自己的Point类。

答案 1 :(得分:1)

首先,不应该设置ItemsControl.Template属性,除非实际想要为其定义新的ControlTemplate ......用相同的替换默认ControlTemplate肯定没有意义。接下来,如果只是ItemView,则Image似乎毫无意义...只需使用Image即可。通过这种方式,您可以正确地绑定您的媒体资源。

有多种方法可以实现您的要求,但您可以RotateTransform使用Orientation,并可以使用TranslateTransform来移动项目。尝试这样的事情:

<ItemsControl ItemsSource="{Binding MyCollection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Image Source="/Images/Fly.png">
                <Image.RenderTransform>
                    <TransformGroup>
                        <RotateTransform Angle="{Binding Orientation}" />
                        <TranslateTransform X="{Binding Position.X}"
                            Y="{Binding Position.Y}" />
                    </TransformGroup>
                </Image.RenderTransform>
            </Image>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>