Привязка вложенного списка к панели холста WPF - PullRequest
2 голосов
/ 07 августа 2011

Мне было интересно, можно ли каким-то образом привязать список списков к панели Cavas. Например, наличие объекта «слой», который сам является списком объектов «прямоугольник». Можно ли связать список слоев с холстом? До сих пор я мог сделать это только путем привязки сплющенного INumerable вложенного списка (используя функцию SelectMany) к itemcontrol, но это не достаточно хорошо, я хотел бы разделить «слои» и иметь Zindex прямоугольников, различающихся в зависимости от слой, на котором он находится, что позволяет легко изменить порядок слоев.

Я также пытался использовать вложенные элементы управления, но, как и ожидалось, он отображает только первый слой. Цель состоит в том, чтобы нарисовать прямоугольник для каждого объекта в каждом слое на холсте, что позволяет манипулировать слоями, вставлять новые объекты в каждый слой и т. Д. *

Заранее спасибо! :)

Ответы [ 2 ]

3 голосов
/ 07 августа 2011

Как насчет создания ItemTemplate основного ItemsControl другого ItemsControl с еще одним Canvas как ItemsPanel?(Я не вижу причины, по которой он должен отображать только первый слой)

На самом деле основной ItemsControl не обязательно должен быть Canvas, Grid также подойдет (по крайней мере, если ваши коллекции не имеют координат своихown или Z-Order, если вы используете сетку, порядок слоев такой же, как у них в коллекции).

Пример (немного многословно, но ничего с этим не поделать):

<ItemsControl ItemsSource="{Binding Data}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding LayerItems}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Canvas />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemContainerStyle>
                    <Style TargetType="{x:Type ContentPresenter}">
                        <!-- Here would the binding to some properties that take care of placement -->
                        <Setter Property="Canvas.Top" Value="{Binding Top}" />
                        <Setter Property="Canvas.Left" Value="{Binding Left}" />
                    </Style>
                </ItemsControl.ItemContainerStyle>
                <ItemsControl.ItemTemplate>
                    <!-- Some template for the individual items -->
                    <DataTemplate>
                        <Border Padding="5" BorderThickness="1" BorderBrush="Red" CornerRadius="3"
                                Background="White">
                            <TextBlock Text="{Binding Name}" />
                        </Border>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
0 голосов
/ 07 августа 2011

Как сказал Х.Б., я тоже не вижу причины, по которой это не сработает. Наличие ItemsControl в другом ItemsContainer прекрасно работает.

<ItemsControl ItemsSource="{Binding Layers}">
  <ItemsControl.ItemsContainerStyle>
    <Style>
     <Setter Property="Template">
      <Setter.Value>
       <ControlTemplate>
         <ItemsControl ItemsSource="{Binding Rectangles}"/>
       </ControlTemplate>
      </Setter.Value>
     </Setter>
    </Style>
  <ItemsControl.ItemsContainerStyle>
</ItemsControl>

Но кажется, что было бы чётче поместить саб ItemsControl в DataTemplate для ваших Предметов, без необходимости изменять ItemsContainerStyle. Я думаю, что это плохой дизайн, если ваш элемент управления должен знать информацию о свойствах модели, которая необходима для привязки к Rectangles.

...