ItemsControl 中 DataTemplate 中的 WPF UserControl - 如何绑定到 ItemsSource 的父级
Posted
技术标签:
【中文标题】ItemsControl 中 DataTemplate 中的 WPF UserControl - 如何绑定到 ItemsSource 的父级【英文标题】:WPF UserControl in DataTemplate within ItemsControl - how to bind to parent of ItemsSource 【发布时间】:2010-11-29 08:30:49 【问题描述】:主题行说明了一切!我有一个用户控件,可以成功地绑定到一个 Fullname 对象 - 即它可以正常工作。
我现在需要显示这些列表,同样,当控件位于 ItemsControl.Template 中的 DataTemplate 中时,这可以正常工作。
但是,该控件有一个属性 (InEditMode),它不是 Fullname 对象的属性,而是具有通过 ItemsSource 绑定 ItemsControl 的 FullnameList 属性的对象的属性。当控件不在列表中并且绑定到名为 ParentInEditMode 和 ParentFullname 的父兄弟属性时,此 InEditMode 属性可以正常工作。
问题是 - 当控件是 ItemsControl 时,需要什么样式的绑定表达式才能“获取”父对象的编辑模式属性?
或者,我应该重新设计 Fullname 对象以包含 EditMode 属性吗?
非常感谢!
更新:
项目(即绑定到 ItemsControl 的集合中的项目)没有这样的属性。代码很简单:
<ItemsControl ItemsSource="Binding Path=FullnameList">
...then...
<ItemsControl.ItemTemplate>
<DataTemplate>
<jasControls:NameView
NameValue="Binding Path=."
InEditMode= ??????? />
整个父级(窗口的视图模型)具有属性:
全名列表
ParentInEditMode
全名(用于测试 NameView 的单个项目,它与任何列表控件之外的此 xaml 完美配合使用:
<jasControls:NameView NameValue="Binding Path=Fullname" InEditMode="Binding Path=ParentInEditMode"/>
我想将编辑模式应用于整个集合 - 将该标志作为 Fullname 的一部分似乎不正确!?
【问题讨论】:
【参考方案1】:我找到了自己问题的答案,希望对其他人有所帮助。 我的工作语法是这样的:
<StackPanel>
<ItemsControl ItemsSource="Binding Path=FullnameList">
...then...
<ItemsControl.ItemTemplate>
<DataTemplate>
<jasControls:NameView
NameValue="Binding Path=."
InEditMode= "Binding DataContext.ParentInEditMode,RelativeSource=RelativeSource FindAncestor, AncestorType=x:Type StackPanel" />
这会正确地选取作为 FullnameList 兄弟的属性并将其传递给数据模板项。更多的是运气而不是判断,但我希望这是一种有效的方法!
【讨论】:
很好的答案:为了更清楚,我会在 DataContext.ParentInEditMode 之前添加 Path=【参考方案2】:对于 ItemsSource 中的每个 Item,ItemsControl 创建指定的 DataTemplate 并为其 DataContext 分配相应的 Item。现在每个 DataTemplate 都可以在其数据上下文中绑定到其项目。
所以我想你的项目确实有一个属性“ParentInEditMode”;绑定到该属性应该没有问题。
如果它不起作用,请用一些代码更新您的问题。
【讨论】:
查看下一个“答案”以获取不适合标准评论区的评论以上是关于ItemsControl 中 DataTemplate 中的 WPF UserControl - 如何绑定到 ItemsSource 的父级的主要内容,如果未能解决你的问题,请参考以下文章
Slider中没有更改Int Array中的值(itemsControl)
某些项目未通过 ItemsSource 显示在 ItemsControl 中
如何获取包含 ItemsControl 内容的 Panel 实例?
在 ItemsControl 中 UpdateSourceTrigger 设置为 PropertyChanged 的 ListBox 在键入时失去焦点