我有一個選項卡列表動態添加到他們的視圖列表。每次用戶添加視圖時,都會創建一個新的選項卡項目。我現在試圖將菜單綁定到tabcontrol的項目,以便用戶可以從菜單中選擇哪個視圖當前是活動視圖。綁定MenuItem的IsChecked到TabItem的IsSelected與動態選項卡
我的菜單,必將爲這樣:
<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屬性。我不希望它使用specfic視圖,而是希望它查看視圖當前綁定到的選項卡項目。
我試過以下,但仍獲得綁定錯誤:
<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爲靜態項目(即的TabControls已經創建自己的標籤項目)工作器isChecked,但對於動態添加的意見,Convert方法不會被調用。這就像TabControl不會發送更新到其項目綁定器的更新。下面是菜單項如何現在有線了:
<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 –
更像是一個兄弟姐妹。我在TabControl的ControlTemplate中定義了菜單,因此它可以調用TabControl的items集合。 – Josh