将内部 ContentControl 控件绑定到父 ItemsControl 项
Binding inner ContentControl control to parent ItemsControl item
我想我几乎明白了,但在寻找最终解决方案时遇到了困难。
- 我有 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>
您可能想尝试获取 ContentControl
的 DataContext
。
<Button Tag="{Binding RelativeSource={RelativeSource AncestorType=ContentControl}, Path=DataContext}" Click="Button_Click"/>
在控件层次结构中有多个从 ContentControl
派生的控件:
ContentControl
(你的)
materialDesign:ColorZone
materialDesign:PopupBox
materialDesign:Card
(未显示)
这就是您的绑定不起作用的原因。在遍历父控件时,它将 return first 控件的数据上下文。此控件是 materialDesign:Card
及其数据上下文 Eeprom
。
如果您在层次结构中指定所需的 ContentControl
,则可以使绑定生效。这是由 AncestorLevel
定义的。您的目标 ContentControl
是父层次结构中的 第四个 ,因此请指定 4
.
<Button Tag="{Binding RelativeSource={RelativeSource AncestorType=ContentControl, AncestorLevel=4}, Path=DataContext}" Click="Button_Click"/>
RelativeSource
绑定的替代方法在这里起作用,它是在目标 ContentControl
上设置 x:Name
并在与 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>
我想我几乎明白了,但在寻找最终解决方案时遇到了困难。
- 我有 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>
您可能想尝试获取 ContentControl
的 DataContext
。
<Button Tag="{Binding RelativeSource={RelativeSource AncestorType=ContentControl}, Path=DataContext}" Click="Button_Click"/>
在控件层次结构中有多个从 ContentControl
派生的控件:
ContentControl
(你的)materialDesign:ColorZone
materialDesign:PopupBox
materialDesign:Card
(未显示)
这就是您的绑定不起作用的原因。在遍历父控件时,它将 return first 控件的数据上下文。此控件是 materialDesign:Card
及其数据上下文 Eeprom
。
如果您在层次结构中指定所需的 ContentControl
,则可以使绑定生效。这是由 AncestorLevel
定义的。您的目标 ContentControl
是父层次结构中的 第四个 ,因此请指定 4
.
<Button Tag="{Binding RelativeSource={RelativeSource AncestorType=ContentControl, AncestorLevel=4}, Path=DataContext}" Click="Button_Click"/>
RelativeSource
绑定的替代方法在这里起作用,它是在目标 ContentControl
上设置 x:Name
并在与 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>