我有一个名为Fly
的对象,它具有属性Position
(Point)和Orientation
(double)。
在我的MainViewModel中,我有一个名为Fly
的自定义对象Flies
的集合。
苍蝇的视图是.png图像。我想将Flies
绑定到MainWindow中的Grid
,使用其属性Position
和Orientation
来显示屏幕上的苍蝇。
我以前从未对这个系列做过这种绑定。我之前做的是将集合绑定到ListBox
或ItemsControl
:
<ItemsControl ItemsSource="{Binding MyCollection}">
<ItemsControl.Template>
<ControlTemplate>
<ScrollViewer>
<ItemsPresenter/>
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:ItemView/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
如何将我的对象绑定到网格或任何其他控件以便能够显示正确的位置和角度方向?
答案 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>
我做了什么
我可以假设苍蝇应该飞,所以在这种情况下你可能想要改变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>