ItemsControl и контролирует вложенные свойства - PullRequest
2 голосов
/ 19 октября 2011

Я пытаюсь реализовать диаграмму с подвижными / изменяемыми размерами частями в WPF. Я хотел бы использовать ItemsControl с ItemsPanel, настроенным как «DynamicCanvas». Все, что вам нужно знать о DynamicCanvas прямо сейчас, это то, что он действует как обычный холст - за одним исключением - он использует вложенные свойства для хранения информации об атрибутах X, Y на своих дочерних элементах.

Мой код:

<ItemsControl IsTabStop="False" ItemsSource="{Binding ElementName=comboBox1,Path=SelectedItem.Source.Table}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <s:TableControl Table="{Binding}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemContainerStyle>
        <Style>

        </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <!--<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">-->
            <c:DynamicCanvas SizeHeightToContent="True" SizeWidthToContent="True"  ClipToBounds="True" SnapsToDevicePixels="True" PreviewMouseDown="Canvas_MouseDown" IsHitTestVisible="True" Background="Gray" >


            </c:DynamicCanvas>
            <!--</ScrollViewer>-->
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

Элементы управления, отображаемые в DynamicCanvas, относятся к моему пользовательскому типу (ниже только самая важная часть):

<ContentControl x:Class="SubiektCommerceSynchro.ViewModel.TableControl"
                c:DynamicCanvas.Left="{Binding X,Mode=TwoWay}" 
                c:DynamicCanvas.Top="{Binding Y,Mode=TwoWay}"
                Width="450"  Height="300"
></ContentControl>

Теперь проблема и вопрос:

Часть, которая здесь не работает, связана с прикрепленными свойствами c: DynamicCanvas.Left (Top). Давайте рассмотрим это поэтапно:

1) DynamicCanvas ожидает, что у его непосредственных потомков будут определены c: DynamicCanvas.Left и c: DynamicCanvas.Top

2) ItemsPanel при помещении TableControls на DynamicCanvas оборачивает их в какой-то контейнер

3) DynamicCanvas не видит прикрепленных свойств в своих непосредственных дочерних элементах => обрабатывает их как расположенные в точке (0,0) и делает их фактически неподвижными.

Как я могу решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Помогает ли это?

        <ItemsControl.ItemContainerStyle>
            <Style>
                <Setter Property="c:DynamicCanvas.Left"
                        Value="{Binding X,Mode=TwoWay}"/>
                <Setter Property="c:DynamicCanvas.Top" 
                        Value="{Binding Y,Mode=TwoWay}"/>
            </Style>
        </ItemsControl.ItemContainerStyle>
1 голос
/ 19 октября 2011

Вы должны изменить ControlTemplate оболочки элемента в ItemContainerStyle. Если вы установите значение ContentPresenter, элементы не будут ни в какую оболочку (содержимое DataTemplate будет вставлено непосредственно в DynamicCanvas).

См. эту статью .

...