ItemsControl中的DataTemplate中的WPF UserControl - 如何绑定到ItemsSource的父级

时间:2009-09-18 01:16:47

标签: wpf data-binding user-controls binding itemscontrol

主题行说明了一切!我有一个用户控件,可以成功绑定到一个Fullname对象 - 即它工作正常。

我现在需要显示这些列表,并且,当控件位于ItemsControl.Template中的DataTemplate中时,这也可以正常工作。

但是,控件有一个属性(InEditMode),它不是Fullname对象的属性,而是具有ItemsControl绑定的FullnameList属性的对象,通过ItemsSource。当控件不在列表中并绑定到名为ParentInEditMode和ParentFullname的父兄弟属性时,此InEditMode属性可正常工作。

问题是 - 当控件是ItemsControl时,“获取”父对象的编辑模式属性需要什么样的绑定表达式?

或者,我应该重新设计Fullname对象以包含EditMode属性吗?

非常感谢提前!

更新

项目(即绑定到ItemsControl的集合中的项目)没有这样的属性。代码很简单:

<ItemsControl ItemsSource="{Binding Path=FullnameList}"> 
...then...
<ItemsControl.ItemTemplate>
  <DataTemplate>
    <jasControls:NameView
      NameValue="{Binding Path=.}" 
      InEditMode= ??????? />

整体父(窗口的视图模型)具有属性:

  • FullnameList
  • ParentInEditMode
  • Fullname(用于测试NameView的单个项目,它使用以下任何列表控件之外的xaml完美地运行:

    <jasControls:NameView NameValue="{Binding Path=Fullname}" InEditMode="{Binding Path=ParentInEditMode}"/>
    

我想将编辑模式应用于整个集合 - 使该标志成为Fullname的一部分似乎不正确!?

2 个答案:

答案 0 :(得分:15)

我找到了自己问题的答案,我希望能帮助别人。 我的工作语法是:

<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的兄弟属性并将其传递给数据模板项。更多的是运气而不是判断,但我希望这是一种有效的方法!

答案 1 :(得分:0)

对于ItemsSource中的每个Item,ItemsControl创建指定的DataTemplate,并为其DataContext分配相应的Item。现在,每个DataTemplate都可以在其数据上下文中绑定到其项目。

所以我想你的项目确实有一个属性“ParentInEditMode”;绑定到该属性应该没有问题。

如果不起作用,请使用一些代码更新您的问题。