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 在键入时失去焦点

根据另一个 ItemsControl 的选定对象更新 ItemsControl.ItemsSource

在 WPF ItemsControl 中绕过栅栏原则