2011-11-01 42 views
0

我有一個選項卡列表動態添加到他們的視圖列表。每次用戶添加視圖時,都會創建一個新的選項卡項目。我現在試圖將菜單綁定到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> 
+0

菜單是TabControl的子項還是兄弟?我以爲tabcontrol的唯一允許的孩子是TabItems –

+0

更像是一個兄弟姐妹。我在TabControl的ControlTemplate中定義了菜單,因此它可以調用TabControl的items集合。 – Josh

回答

0

TabControl.Items將讓你回來的意見,因爲這是你必然要什麼你的TabControl有動態標籤視圖。

不幸的是,沒有一個屬性可以直接綁定到TabControl上,這會爲您提供一個TabItems集合。這些實際上是Item綁定集合中每個項目的ItemContainers。

你可能要做的是創建一個轉換器或其他東西。你可以嘗試使用myTabControl.ItemContainerGenerator。 ContainerFromItem並傳入視圖對象以取回包裝它的實際TabItem。然後你的IsSelected綁定將工作。

您可能會考慮直接綁定到TabControl本身而不是Items屬性。然後轉換器可以很容易地對ContainerFromItem進行上述調用。然後你必須通過枚舉Items屬性來爲轉換器返回List<TabItems>(爲每個屬性調用ContainerFromItem)。

無論如何,希望這會讓你走上正軌!

+0

讓我開始了正確的軌道,但沒有完全解決動態視圖的問題。不過,讓我走了。 – Josh

0

這裏更簡單些。定義包含表示突出部的ViewModels和的菜單項的,像這樣

//Not showing here the details of implementing INPC 
public class MyCustomCompositeViewModel:INotifyPropertyChanged 
{ 
    public ObservableCollection<CompositeViewItem>CompositeItems{get;set;} 
    public CompositeViewItem SelectedItem{get;set;} 
} 

在視圖的集合的頂層視圖模型,所述的TabItems結合CompositeItems收集和所選擇的標籤項結合到selectedItem屬性。您可以類似地綁定菜單項

compositeviewitem應該提供屬性,如項目的名稱(用於在選項卡和菜單上顯示),以及可能需要View用於渲染的附加數據。希望這是有道理的。

相關問題