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

8
主题行说的已经很清楚了!我有一个用户控件,可以成功地绑定到Fullname对象上 - 也就是说,它可以正常工作。
现在我需要显示这些内容的列表,在ItemsControl.Template中的DataTemplate中,这也可以正常工作。
但是,该控件具有一个属性(InEditMode),它不是Fullname对象的属性,而是具有FullnameList属性的对象的属性,通过ItemsSource将其绑定到ItemsControl。当控件不在列表中且绑定到父兄弟属性(例如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 (single item for testing NameView which works perfectly with this xaml outside of any list control using:

     <jasControls:NameView NameValue="{Binding Path=Fullname}" InEditMode="{Binding Path=ParentInEditMode}"/>
    
我希望将编辑模式应用于整个集合——将该标志作为Fullname的一部分似乎不太合适!
2个回答

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的兄弟属性,并将其传递给数据模板项。虽然有些侥幸,但我希望这是一种有效的做法!


很好的回答:为了更清晰,我会在DataContext.ParentInEditMode之前添加Path=。 - Dabblernl

0
对于ItemsSource中的每个项目,ItemsControl都会创建指定的DataTemplate,并将其DataContext分配给相应的Item。现在,每个DataTemplate都可以绑定到其数据上下文中的项目。
所以我想你的项目确实有一个属性"ParentInEditMode";绑定到该属性应该没有问题。
如果不起作用,请使用一些代码更新您的问题。

请参见下一个“答案”以获取无法适合标准评论区域的注释 - J Stewart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接