我目前正在尝试使用下面一个ItemsControl对象的集合绑定到Silverlight 3的画布:
<ItemsControl x:Name="ctrl" ItemsSource="{Binding myObjectsCollection}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas></Canvas>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Rectangle Stroke="LightGray" Fill="Black" StrokeThickness="2"
RadiusX="15" RadiusY="15" Canvas.Left="{Binding XAxis}"
Height="25" Width="25">
</Rectangle>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
不幸的是,似乎在Canvas.Left结合被忽略。 从我了解到这里会出现,这是由于被放置在内容展示器而不是实际的画布我在项目小组已经指定里面的物品。
有没有一种方法,我可以使用数据绑定,以确定在画布上元素的位置?
我知道这已经接受了答案,但要实现最初的目标,而不带空白搞乱的方法是创建一个自定义的ItemsControl和覆盖PrepareContainerForItemOverride方法。 在这种方法中,你在代码中设置绑定。
public class CustomItemsCollection
: ItemsControl
{
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
FrameworkElement contentitem = element as FrameworkElement;
Binding leftBinding = new Binding("Left"); // "Left" is the property path that you want to bind the value to.
contentitem.SetBinding(Canvas.LeftProperty, leftBinding);
base.PrepareContainerForItemOverride(element, item);
}
}
不能使用ItemsControl.ItemContainerStyle
在Silverlight。 它不存在。 它只存在像情侣叶级类的ListBox
本身。
你说得对,一个ContentPresenter在画布上插入和矩形之间。 一个解决办法是设置左边距,而不是一个Canvas.Left
:
<Rectangle Stroke="LightGray" Fill="Black" StrokeThickness="2"
RadiusX="15" RadiusY="15" Height="25" Width="25">
<Rectangle.Margin>
<Thickness Left="{Binding XAxis}"/>
</Rectangle.Margin>
</Rectangle>
我知道这个问题是有点老了,但你可以只使用一个渲染变换 - 我在做类似的东西;
<ItemsControl ItemsSource="{Binding Notes}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Background="Aqua"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Width="{Binding W}" Height="{Binding H}" BorderBrush="Navy" BorderThickness="5" CornerRadius="10">
<TextBlock Text="{Binding Text}"/>
<Border.RenderTransform>
<TransformGroup>
<RotateTransform Angle="0"/>
<TranslateTransform X="{Binding X}" Y="{Binding Y}"/>
</TransformGroup>
</Border.RenderTransform>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
以下添加到您的ItemsControl
<ItemsControl.ItemContainerStyle>
<Style TargetType="{x:Type ContentPresenter}">
<Setter Property="Canvas.Left" Value="{Binding XPath=XAxis}"/>
</Style>
</ItemsControl.ItemContainerStyle>
无需任何自定义控件