wpf - ItemsControl 和控件附加属性

标签 wpf itemscontrol

我正在尝试在 WPF 中实现一个带有可移动/可调整大小的部分的图表。 我想将 ItemsControl 与配置为“DynamicCanvas”的 ItemsPanel 一起使用。 您现在需要了解的有关 DynamicCanvas 的信息是,它的行为就像一个普通的 Canvas - 但有一个异常(exception) - 它利用附加属性来存储有关其子项的 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) 并使其有效地不可移动。

如何解决这个问题?

最佳答案

这有帮助吗?

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

关于wpf - ItemsControl 和控件附加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7820551/

相关文章:

c# - 如何从 XAML 引用嵌入式资源?

wpf - 创建自定义项目控件

c# - 在代码中获取 ItemsControl 中包含的控件

wpf - 列表框数据模板文本溢出

wpf - 将网格行的高度绑定(bind)到 WPF 中的内容

wpf - 使用带有 ItemsControl 的 ScrollViewer 和 Canvas 作为 ItemsPanel

c# - WPF 绑定(bind) ObservableCollection<string> 到 ItemsControl 不起作用

c# - 从*新* ComboBox 文本更新,而不是旧文本

c# - 单元测试 WPF 中的 ResourceDictionay

wpf - 弹出窗口出现在其父级的右下角