9

何らかの理由で、ビューモデルTabControlにバインドするときに適切に表示するItemsSourceのに時間がかかります。ObservableCollectionここにあるチュートリアルに基づいて設計しています: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx。ここで私のような質問をいくつか見つけましたが、私の特定の状況に対処するものはありませんでした。これは私TabControlのxamlです。

<TabControl ItemsSource="{Binding Workspaces}"
            SelectedIndex="{Binding ActiveWorkspaceIndex}"
            ItemTemplate="{StaticResource ClosableTabItemTemplate}"/>

以下の場所ClosableTabItemTemplateです。

<DataTemplate x:Key="ClosableTabItemTemplate">
        <DockPanel Width="120">
          <Button 
              Command="{Binding Path=CloseCommand}"
              Content="X"
              Cursor="Hand"
              DockPanel.Dock="Right"
              Focusable="False"
              FontFamily="Courier" 
              FontSize="9"
              FontWeight="Bold"  
              Margin="0,1,0,0"
              Padding="0"
              VerticalContentAlignment="Bottom"
              Width="16" Height="16" 
              />
          <ContentPresenter 
              Content="{Binding Path=DisplayName}" 
              VerticalAlignment="Center" 
              />
        </DockPanel>
      </DataTemplate>

WorkspacesObservableCollectionビューモデルのです。ActiveWorkspaceIndexビュー モデルで追跡しているアクティブなワークスペース インデックスです。App.xaml ファイルの次のデータ テンプレートを使用して、ビュー モデルをビューのインスタンスに関連付けます。

<DataTemplate DataType="{x:Type vm:ViewModelStartPage}">
     <v:ViewStartPage/>
 </DataTemplate>

ワークスペースのコレクションにビュー モデルを 1 つだけ追加します。タブ コントロールに 2 つのビューが表示されますが、それらはタブ化されていません。TabControl がさまざまなビューを TabItems として扱うことを知らないようで、ビューを積み重ねるスタック パネルのように動作します。コードでタブ項目を作成すると、次のように正常に動作します。

System.Windows.Controls.TabItem i = new System.Windows.Controls.TabItem();
i.Content = new Views.ViewStartPage();
i.Header = "A Tab Item";
this.xTabControl.Items.Add(i); 

コンテンツ テンプレートか何かが不足しているに違いありません。後でタブのスタイルを設定しますが、今のところ、基本的なタブが機能するだけで十分です。また、タブのコンテンツのビューはタブごとに異なる場合があるため、いたるところで見られる単純なテキストブロック TabControl テンプレートの例を使用できません...つまり、これではありません...

<TabControl.ContentTemplate>
    <DataTemplate>
        <TextBlock
           Text="{Binding Content}" />
    </DataTemplate>

何か案は?

4

1 に答える 1

7

私は(元のチュートリアルプロジェクトのように)データテンプレートContentControlでを使用することになりました。TabControlこれが私が最終的に作成したxamlコードです。これを機能させるために、元のサンプルプロジェクトからコードビハインドを変更しませんでした。これContentControlは私のMainWindow.xamlにあり、他の2つのコードはにありResourceDictionaryます。

<!-- Workspaces Tab Control -->
      <ContentControl Grid.Row="1"
                      VerticalAlignment="Stretch"
                      HorizontalAlignment="Stretch"
                      Content="{Binding Path=Workspaces}"
                      ContentTemplate="{StaticResource WorkspacesTemplate}"/>

<!-- Workspaces Template -->
  <DataTemplate x:Key="WorkspacesTemplate">
    <TabControl Style="{StaticResource ClosableTabControl}"
                IsSynchronizedWithCurrentItem="True"
                ItemsSource="{Binding}"
                ItemTemplate="{StaticResource WorkspaceTabItemTemplate}"
                Margin="1"/>
  </DataTemplate>


<!-- Workspace Tab Item Template -->
  <DataTemplate x:Key="WorkspaceTabItemTemplate">
    <Grid Width="Auto" Height="Auto">
      <ContentPresenter ContentSource="Header" Margin="3" 
                        Content="{Binding Path=DisplayName}"
                        HorizontalAlignment="Center" VerticalAlignment="Center">
        <ContentPresenter.Resources>
          <Style TargetType="TextBlock">
            <Setter Property="Foreground" Value="{StaticResource Foreground}"/>
          </Style>
        </ContentPresenter.Resources>
      </ContentPresenter>
    </Grid>
  </DataTemplate>
于 2012-12-30T20:55:35.167 に答える