3

そのため、実行時にビューをのItemsコレクションに直接追加していTabControlます(ビューの周囲にTabItemを作成して、それらのTabItemをTabControlに追加する代わりに)。HasChangesビューは、VSと同様に、のヘッダーにバインドする名前のプロパティ(同じ名前のViewModelプロパティのラッパー)を公開して、TabItem変更が保存されていないタブを識別するためのアスタリスク(*)記号を表示します。すでにDataTemplatesを使用しようとしましたが、のビューオブジェクトにアクセスできませんDataTemplate。これを行う正しい方法は何ですか?これが私のいくつかの試みの1つです:

<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>

TextBlock2つのsに対して2つの異なるバインディング方法を試していますが、どちらも機能していないことに注意してください。私のビューは、プロパティとを継承しUserControlて公開します。HasChangesHeaderText

4

1 に答える 1

6

わかった。自分で解決しました。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プロパティを実装する必要があります。さらにBooleanToVisibilityConverter、リソースセクションでB2VConverterという名前のを定義する必要があります。

于 2013-03-19T06:33:52.603 に答える