Wpf ItemsControl和控件附加属性

Wpf ItemsControl和控件附加属性,wpf,itemscontrol,Wpf,Itemscontrol,我试图在WPF中实现一个带有可移动/可调整大小的部分的图。 我想使用ItemsControl,将ItemsPanel配置为“DynamicCanvas”。 关于DynamicCanvas,您现在需要知道的是,它的行为就像一个普通的画布——只有一个例外——它利用附加的属性来存储关于其子对象上X、Y属性的信息 我的代码: <ItemsControl IsTabStop="False" ItemsSource="{Binding ElementName=comboBox1,Path=Select

我试图在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上显示的控件属于我的自定义类型(以下仅是最重要的部分):


现在问题和问题是:

这里不起作用的部分是附加属性c:DynamicCanvas.Left(顶部)。 让我们把它分为几个步骤:

1) DynamicCanvas希望其直接子级定义c:DynamicCanvas.Left和c:DynamicCanvas.Top

2) ItemsPanel将TableControls放入DynamicCanvas时,会将它们包装在某种容器中

3) DynamicCanvas在其直接子级上看不到附加属性=>将它们视为位于(0,0)处,并使它们实际上不可移动


如何解决此问题?

您必须在
ItemContainerStyle
中修改项目包装的
ControlTemplate
。如果将其设置为simple
ContentPresenter
,则项目将不会被任何内容包装(将
DataTemplate
的内容直接粘贴到
DynamicCanvas
中)

请参阅。

这有帮助吗

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


解决方案大不相同,但方向是正确的,谢谢。我不得不把
放在ItemContainerStyle中。我不知道为什么,但我还没有看到你的答案。我自己也发现了这一点,甚至在下面写了一条评论。不过,谢谢你。
        <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>