2013-03-18 69 views
2

所以我在運行時直接將我的視圖添加到TabControl的Items集合(而不是圍繞它們創建TabItem並將這些TabItem添加到TabControl)。這些視圖公開了一個名爲HasChanges的屬性(包裝在名稱相同的ViewModel屬性周圍),我想綁定到TabItem的標題以顯示星號(*)標識以標識未保存更改的選項卡,就像VS一樣。我已經嘗試使用DataTemplates,但無法訪問DataTemplate中的視圖對象。這樣做的正確方法是什麼?這裏是我的幾次嘗試之一:修改TabControl的標題

<TabControl.ItemTemplate> 
    <DataTemplate DataType="UserControl"> 
     <StackPanel Orientation="Horizontal" Margin="0" Height="22"> 
      <TextBlock VerticalAlignment="Center" Text="{Binding HeaderText, RelativeSource={RelativeSource AncestorType=UserControl}}" /> 
      <TextBlock Text="*" Visibility="{Binding HasChanges, RelativeSource={RelativeSource Mode=TemplatedParent}, Converter={StaticResource B2VConverter}}" /> 
     </StackPanel> 
    </DataTemplate> 
</TabControl.ItemTemplate> 

注意,我想兩個TextBlock s,這都不是工作兩個不同的結合方式。我的觀點繼承自UserControl並揭示了屬性HasChangesHeaderText

回答

5

好的。我自己解決了它。對於任何人試圖執行一個VS般的關閉按鈕,未保存的更改星號,這裏的模板:

<TabControl.ItemContainerStyle> 
    <Style TargetType="{x:Type TabItem}"> 
     <Setter Property="HeaderTemplate" > 
      <Setter.Value> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal" Margin="0" Height="22"> 
         <TextBlock VerticalAlignment="Center" Text="{Binding RelativeSource={RelativeSource AncestorType=TabItem}, Path=Content.HeaderText}" /> 
         <TextBlock Text=" *" ToolTip="Has unsaved changes" Visibility="{Binding Content.DataContext.HasChanges, RelativeSource={RelativeSource AncestorType=TabItem}, Converter={StaticResource B2VConverter}}" /> 
         <Button Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" Width="18" Height="18" 
           Margin="6,0,0,0" Padding="0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Center" 
           Command="{Binding DataContext.TabClosingCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" 
           CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}" 
           VerticalAlignment="Center" Focusable="False"> 
          <Grid Margin="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
           <Line StrokeThickness="3" StrokeStartLineCap="Round" StrokeEndLineCap="Round" Stroke="Gray" X1="1" Y1="1" X2="9" Y2="9" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
           <Line StrokeThickness="3" StrokeStartLineCap="Round" StrokeEndLineCap="Round" Stroke="Gray" X1="1" Y1="9" X2="9" Y2="1" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
          </Grid> 
         </Button> 
        </StackPanel> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</TabControl.ItemContainerStyle> 

結果與一臺外觀優雅的圖紙爲基礎的按鈕。您的視圖必須實現布爾型​​HasChangesHeaderText屬性,此外還需要在名爲B2VConverter的資源部分中定義BooleanToVisibilityConverter

+0

+1但你能擴展一個完整的例子嗎?我對此非常陌生,並且試圖從我能夠掌握的任何東西中學習。謝謝你的時間。 – MoonKnight 2013-05-20 21:56:29