将内部ContentControl控件绑定到父ItemsControl项

问题描述

我想我差不多了,但是在最后的解决方案中苦苦挣扎。

  • 我有 BoardList ItemsControl,其中有N个项目-全部 有效。
  • 我有一个内部 Eeprom ContentControl,其中包含某些字段-一切正常,除了我必须将按钮的Tag绑定到ItemsControl项目。在后面的代码中,我将将此Tag投射到 Board 对象并执行各种操作。

如您所见,我尝试使用RelativeSource,但这使我进入了实际的ItemsControl,而不是物品本身。这可能是我所缺少的愚蠢之举,但我无法理解。 任何帮助表示赞赏。谢谢!

<!--List of "Board" items-->
<ItemsControl ItemsSource="{Binding BoardList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <GroupBox>
                <!--Eeprom is an object within "Board" item-->
                <ContentControl Content="{Binding Eeprom}">
                    <ContentControl.ContentTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBox Text="{Binding IdPage}"/>
                                <Button Tag="{Binding RelativeSource={RelativeSource AncestorType=ItemsControl}}" Click="Button_Click"/>
                            </StackPanel>
                        </DataTemplate>
                    </ContentControl.ContentTemplate>
                </ContentControl>
            </GroupBox>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

完整版本(我无意中离开了重要的容器):

<!--List of "Board" items-->
<ItemsControl ItemsSource="{Binding ContrSysAccessor.IBoardList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <!--Eeprom is an object within "Board" item-->
            <ContentControl Content="{Binding Eeprom}">
                <ContentControl.ContentTemplate>
                    <DataTemplate>
                        <materialDesign:ColorZone>
                            <materialDesign:PopupBox>
                                <StackPanel>
                                    <TextBox Text="{Binding IdPage}"/>
                                    <Button Tag="{Binding RelativeSource={RelativeSource AncestorType=ContentControl},Path=DataContext}" Click="Button_Click"/>
                                </StackPanel>
                            </materialDesign:PopupBox>
                        </materialDesign:ColorZone>
                    </DataTemplate>
                </ContentControl.ContentTemplate>
            </ContentControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

解决方法

您可能想尝试获取[0 if x is None else x for x in listing] 中的DataContext

ContentControl
,

在控件层次结构中有多个从ContentControl派生的控件:

  • ContentControl(您的)
    • materialDesign:ColorZone
      • materialDesign:PopupBox
        • materialDesign:Card(未显示)

这就是为什么您的绑定不起作用的原因。在遍历父控件时,它将返回 first 控件的数据上下文。该控件为materialDesign:Card,其数据上下文为Eeprom

如果您要在层次结构中指定哪个ContentControl,则可以使绑定工作。这由AncestorLevel定义。您的目标ContentControl是父层次结构中的第四,因此请指定4

<Button Tag="{Binding RelativeSource={RelativeSource AncestorType=ContentControl,AncestorLevel=4},Path=DataContext}" Click="Button_Click"/>

在这里工作的RelativeSource绑定的替代方法是在目标x:Name上设置ContentControl,并在与ElementName的绑定中引用它。

<ItemsControl ItemsSource="{Binding Parent}">
   <ItemsControl.ItemTemplate>
      <DataTemplate>
         <!--Eeprom is an object within "Board" item-->
         <ContentControl x:Name="MyContentControl" Content="{Binding Text}">
            <ContentControl.ContentTemplate>
               <DataTemplate>
                  <materialDesign:ColorZone>
                     <materialDesign:PopupBox>
                        <StackPanel>
                           <TextBox Text="{Binding Mode=OneWay}"/>
                           <Button Tag="{Binding DataContext,ElementName=MyContentControl}" Click="Button_Click"/>
                        </StackPanel>
                     </materialDesign:PopupBox>
                  </materialDesign:ColorZone>
               </DataTemplate>
            </ContentControl.ContentTemplate>
         </ContentControl>
      </DataTemplate>
   </ItemsControl.ItemTemplate>
</ItemsControl>