Silverlight 3 - Положение привязки данных прямоугольника на холсте - PullRequest
5 голосов
/ 28 октября 2009

В настоящее время я пытаюсь привязать коллекцию объектов к Canvas в Silverlight 3 с помощью ItemsControl, как показано ниже:

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

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

Ответы [ 5 ]

7 голосов
/ 13 ноября 2009

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

}
2 голосов
/ 06 апреля 2010

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

1 голос
/ 27 января 2011

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

<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>
1 голос
/ 29 октября 2009

Вы правы, 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 голосов
/ 15 марта 2010

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

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

Не нужно никаких пользовательских элементов управления

...