问题描述
我想我差不多了,但是在最后的解决方案中苦苦挣扎。
- 我有 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>