2009-10-28 14 views
5

actualmente estoy tratando de obligar a una colección de objetos a un lienzo en Silverlight 3 utilizando un ItemsControl de la siguiente manera:Silverlight 3 - Enlace de datos de posición de un rectángulo en un lienzo

<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> 

Por desgracia, parece la unión de el Canvas.Left está siendo ignorado. Por lo que he aprendido here, parece que esto se debe a que los elementos se colocaron dentro de un presentador de contenido, no al lienzo real que he especificado en el panel de elementos.

¿Hay una manera que puede utilizar el enlace para determinar la posición de los elementos en un lienzo de datos?

Respuesta

7

que darse cuenta de que esto ya tiene una respuesta aceptada, pero la manera de lograr el objetivo inicial sin jugar con los márgenes es crear una costumbre ItemsControl y anula el método PrepareContainerForItemOverride. En este método, establece el enlace en el código.

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); 
    } 

} 
1

tiene usted razón, se inserta un ContentPresenter entre el lienzo y el rectángulo. Una solución sería establecer un margen izquierdo en lugar de un 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> 
+0

Lamentablemente, la propiedad Left is readonly and no se puede establecer. – Blounty

+1

No sé la razón por la cual es de solo lectura. De todos modos, pude hacer que funcione usando un convertidor de valor: pero ciertamente no es una solución elegante. – Mart

+0

¿Cómo funciona el LeftMarginConverter y cuando esto se aplica se aplica el margen de todas las partidas consolidadas en relación con el borde izquierdo del contenedor? – Blounty

-2

Añadir lo siguiente a su ItemsControl

<ItemsControl.ItemContainerStyle> 
    <Style TargetType="{x:Type ContentPresenter}"> 
     <Setter Property="Canvas.Left" Value="{Binding XPath=XAxis}"/> 
    </Style> 
    </ItemsControl.ItemContainerStyle> 

No hay necesidad de ninguna costumbre controla

+1

Esto no puede trabajar, ya que el ItemsControl no tiene una propiedad ItemContainerStyle en Silverlight (v3 o v4). En WPF sí, pero esa no es la pregunta. – Anthony

2

No puede utilizar ItemsControl.ItemContainerStyle en Silverlight. No existe. Solo existe en un par de clases de nivel de hoja como ListBox.

1

Sé que esta pregunta es un poco viejo, pero sólo se puede utilizar un render transformo - que estoy haciendo algo similar;

<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> 
Cuestiones relacionadas