【发布时间】:2011-11-01 19:26:07
【问题描述】:
我有一个标签项列表,其中动态添加了视图。每次用户添加视图时,都会创建一个新的选项卡项。我现在正在尝试将菜单绑定到 tabcontrol 的项目,以便用户可以从菜单中选择当前是活动视图的视图。
我的菜单是这样绑定的:
<Menu Background="Transparent">
<MenuItem Style="{StaticResource TabMenuButtonStyle}" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}, Path=Items}" ItemContainerStyle="{StaticResource TabMenuItem}"></MenuItem>
</Menu>
这可以正常工作并且具有预期的效果(每个菜单项都是所有打开选项卡的列表)。
我有以下样式将菜单项绑定到选项卡项的 IsSelected 属性:
<Setter Property="IsChecked" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
我的问题是,这个绑定不起作用。绑定错误消息表明它在视图对象上找不到 IsSelected 属性。我不希望它使用特定视图,而是希望它查看视图当前绑定到的选项卡项。
我尝试了以下方法,但仍然出现绑定错误:
<Setter Property="IsChecked" Value="{Binding Path=IsSelected, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=TabItem}}}" />
这表明它无法为每个菜单项找到 TabItem 类型的祖先(这是有道理的,因为菜单项的祖先不是它所绑定的。)
有什么方法可以访问作为绑定传入的项目的父项,以便绑定到它的属性?
更新:
根据 Yadyn 的建议,我决定创建一个值转换器并返回选项卡项。
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
ItemCollection ic = (ItemCollection)value;
List<TabItem> tabItems = new List<TabItem>();
foreach (var obj in ic) {
tabItems.Add((TabItem)obj);
}
return tabItems;
}
这使得 IsSelected 绑定到 IsChecked 对静态项(已创建其选项卡项的 TabControl)有效,但对于动态添加的视图,永远不会调用 Convert 方法。就像 TabControl 没有向其项目的活页夹发送已更改的更新。下面是 MenuItem 现在的连接方式:
<MenuItem Style="{StaticResource TabMenuButtonStyle}" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}, Path=Items, Mode=OneWay, NotifyOnSourceUpdated=True, Converter={StaticResource TabControlItemConverter}}" ItemContainerStyle="{StaticResource TabMenuItem}"></MenuItem>
【问题讨论】:
-
菜单是 TabControl 的子项还是同级项?我认为唯一允许的 tabcontrol 子项是 TabItems
-
更像兄弟姐妹。我在 ControlTemplate 中为 TabControl 定义了菜单,因此它可以调用 TabControl 的项目集合。