在 ItemsControl DataTemplate 中设置 Canvas 属性
Posted
技术标签:
【中文标题】在 ItemsControl DataTemplate 中设置 Canvas 属性【英文标题】:Setting Canvas properties in an ItemsControl DataTemplate 【发布时间】:2010-11-18 22:02:44 【问题描述】:我正在尝试将数据绑定到这个ItemsControl
:
<ItemsControl ItemsSource="Binding Path=Nodes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
通过使用这个DataTemplate
,我正在尝试将我的Node
元素正确地定位在Canvas
上:
<DataTemplate DataType="x:Type Model:EndNode">
<Controls:EndNodeControl Canvas.Left="Binding Path=XPos" Canvas.Top="Binding Path=YPos" />
</DataTemplate>
但是,它没有按预期工作。我所有的节点元素都在同一位置相互叠加。关于如何实现这一点的任何建议?
【问题讨论】:
【参考方案1】:附加属性仅适用于Canvas
的直接子代。 ItemsControl
会将 ContentPresenter
控件作为其直接子元素,因此您可能还需要为其添加样式:
<ItemsControl ItemsSource="Binding Path=Nodes">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="Binding Path=XPos" />
<Setter Property="Canvas.Top" Value="Binding Path=YPos" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
【讨论】:
谢谢。大约 5 分钟前,我自己找到了这个解决方案。我想我发布这个问题有点快。 :) 呵呵.. 我也喜欢那些 AHA 时刻 ;).. 不过也不是很糟糕.. 也许你的问题有一天也能帮助其他人.. 你永远不会知道!跨度> @skb 我也有同样的问题,有没有 Silverlight 解决方法? 如果我的 X 和 Y 位置应该在 ItemsSource 的对象之一内怎么办?我的 ItemsSource 中有一个 Point 对象。 我找到了 Metro/UWP 应用的解决方法 - ***.com/a/37821355/3431319以上是关于在 ItemsControl DataTemplate 中设置 Canvas 属性的主要内容,如果未能解决你的问题,请参考以下文章
根据另一个 ItemsControl 的选定对象更新 ItemsControl.ItemsSource
某些项目未通过 ItemsSource 显示在 ItemsControl 中
在 ItemsControl DataTemplate 中设置 Canvas 属性
ItemsControl 子项在请求 Canvas.GetLeft 时返回 NAN
在 ItemsControl 中 UpdateSourceTrigger 设置为 PropertyChanged 的 ListBox 在键入时失去焦点