1

私はWPFを初めて使用し、この例を出発点として使用してアプリケーションを作成しています http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090025

一度に表示できるワークスペースは 1 つだけなので、TabControl を取り除き、代わりに単純なものを使用したいと考えています。おそらく ContentControl です。よくわかりませんが、必要なのはコンテンツを入れて閉じられるようにすることだけです。 . だから私はこれを置き換えようとしています:

<DataTemplate x:Key="WorkspacesTemplate"><TabControl 
  IsSynchronizedWithCurrentItem="True" 
  ItemsSource="{Binding}" 
  ItemTemplate="{StaticResource ClosableTabItemTemplate}"
  Margin="4"
  />

と:

<DataTemplate x:Key="WorkspacesTemplate">
    <ContentControl Content="{Binding ??}" ContentTemplate="{StaticResource ClosableTabItemTemplate}"/>
</DataTemplate>

しかし、何にバインドすればよいかわかりません。例のコードは CollectionViewSource を使用してアクティブなワークスペースを設定しているようです - それは私が興味を持っているアクティブなワークスペースですが、 IsSynchronizedWithCurrentItem="True" と関係があることを除いて、TabControl が何をしているのか理解できません。

テンプレートはここから呼び出されます (Workspaces は ViewModels の ObservableCollection です)。

<HeaderedContentControl Content="{Binding Path=Workspaces}" ContentTemplate="{StaticResource   WorkspacesTemplate}" Header="Workspaces" Style="{StaticResource MainHCCStyle}"/>

これが ClosableItem テンプレートです。

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

誰かが私が何をする必要があるか説明できますか? ありがとう

4

1 に答える 1

2

は、プロパティのWorkspacesTemplate表示方法をWPFに指示しています。これは、おっしゃるように、ViewModelsのものです。WorkspacesObservableCollection

つまり、WorkspacesTemplateこれらすべてのViewModelをタブコントロールに表示し、ViewModelごとに、を使用しClosableTabItemTemplateてViewModelをタブに表示します。

一度に表示できるワークスペースは1つだけなので、ViewModelからワークスペースのコレクションを公開する必要はなく、それらを表示するためのタブコントロールも必要ありません。ViewModelから現在のワークスペースを1つ公開し、それを表示するためのXAMLを提供するだけです。

それでもテンプレートを使用してViewModelをラップする場合は、はい、aを使用しContentControlてテンプレートを呼び出すことができます。

<DataTemplate x:Key="MySingleWorkspaceTemplate">
    <TextBlock Text={Binding Blah} />
    <!-- etc -->
</DataTemplate>

テンプレートを呼び出す

<ContentControl Content="{Binding CurrentWorkspace}" ContentTemplate="{StaticResource MySingleWorkspaceTemplate}"/>

ただし、これがXAMLが使用される唯一の場所である場合は、テンプレートを忘れて、XAMLを直接宣言することをお勧めします。例:(ContentControlの代わりに)

<TextBlock Text={Binding CurrentWorkspace.Blah} />
<!-- etc -->

追加するために編集:

現在、ViewModelには「選択されたワークスペース」の概念がなく、コレクションを公開するだけなので、混乱するかもしれません。完全を期すために(ただし、これについては気にしないでください)、コレクションのデフォルトをTabControl間接的に使用し、選択されたアイテムの概念を持つによって選択が導入されます。これはすべてビューにあります。CollectionViewWorkspacesCollectionView

今はこれについて心配する必要はありません。ViewModelから1つのワークスペースを自分で公開するだけです。

EDIT2:

を明示的に設定しているため、閉じるボタンが表示ContentTemplateされていますHeaderedContentControl。このテンプレートは、に関係なく表示されContentます。

にデータがある場合にのみテンプレートを表示するにはContent、代わりにテンプレートを暗黙的にします。テンプレート定義にを追加するDataType(そしてキーを削除する)場合は、常にこのテンプレートを使用してそのデータ型のオブジェクトを表示するようにWPFに指示します。

<DataTemplate DataType="{x:Type vm:WorkspaceViewModel}">
    <!-- Blah -->
</DataTemplate>

次に、から明示的なテンプレートを削除できますHeaderedContentControl。テンプレートを呼び出すには、を設定するだけContentで十分です。コンテンツがない場合は、テンプレートはありません。

<HeaderedContentControl Content="{Binding Path=CurrentWorkspace}" />

(ps。のヘッダーを使用していない場合はHeaderedContentControl、bog標準を使用することをお勧めしますContentControl

于 2012-04-16T12:32:54.507 に答える