ItemsControl和控制附加属性

时间:2011-10-19 11:21:13

标签: wpf itemscontrol

我正在尝试在WPF中实现带有可移动/可调整大小的部分的图表。 我想将ItemsConnel与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)将TableControl放到DynamicCanvas上的ItemsPanel将它们包装在某种容器中

3)DynamicCanvas在其直接子节点上看不到附加属性=&gt;将它们视为位于(0,0)并使它们无法移动。

如何解决此问题?

2 个答案:

答案 0 :(得分:3)

这有帮助吗?

        <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 :(得分:1)

您必须修改ControlTemplate中项目包装器的ItemContainerStyle。如果您将其设置为简单ContentPresenter,那么这些项目将不会包含在任何内容中(DataTemplate的内容将直接粘贴到DynamicCanvas中)。

请参阅this article