2009-10-28 5 views
5

я в настоящее время пытаюсь связать коллекцию объектов на холст в Silverlight 3 с помощью 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 игнорируется. Из того, что я узнал here, похоже, это связано с тем, что элементы размещены внутри медиа-презентатора, а не фактическое холст, указанный мной на панели элементов.

Есть ли способ, которым я могу использовать привязку данных для определения положения элементов на холсте?

ответ

7

Я понимаю, что это уже есть ответ принят, но путь для достижения первоначальной цели, не портя с полями, чтобы создать пользовательский 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); 
    } 

} 
1

Вы правы, ContentPresenter вставлен между Canvas и Rectangle. Один обходной путь будет установить левое поле вместо 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

К сожалению, свойство Left - только для чтения и не может быть установлено. – Blounty

+1

Я не знаю, почему он доступен только для чтения. В любом случае мне удалось сделать эту работу, используя конвертер значений: , но это, безусловно, не изящное решение. – Mart

+0

Как работает LeftMarginConverter, и когда он применяется, - это маржа, применяемая ко всем связанным элементам относительно левого края контейнера? – Blounty

-2

Добавьте следующие строки в ItemsControl

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

Нет необходимости в какой-либо обычай не контролирует

+1

Это не может работать, так как ItemsControl не имеет свойства ItemContainerStyle в Silverlight (v3 или v4). В WPF да, но это не вопрос. – Anthony

2

Вы не можете использовать ItemsControl.ItemContainerStyle в Silverlight. Этого не существует. Он существует только на нескольких классах уровня листа, таких как ListBox.

1

Я знаю, что этот вопрос немного стар, но вы можете просто использовать преобразование визуализации - я делаю что-то подобное;

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