3

私は宣言しましたViewModel

public class DefaultViewModel : WorkspaceViewModel
{
    public DefaultViewModel()
    {
        this.DisplayName = "Welcome!";
    }
}

を活用しCollectionViewSourceて、アクティブな「ワークスペース」を設定します。

// this code comes from the MainWindowViewModel.cs
void SetActiveWorkspace(WorkspaceViewModel workspace)
{
    Debug.Assert(this.Workspaces.Contains(workspace));

    ICollectionView collectionView =
        CollectionViewSource.GetDefaultView(this.Workspaces);
    if (collectionView != null)
        collectionView.MoveCurrentTo(workspace);
}

Iのコンストラクターで、MainWindowViewModel.csデフォルトの「ワークスペース」をセットアップします。

public MainWindowViewModel()
{
    this.DisplayName = "Big File Reader";

    var viewModel = new DefaultViewModel();
    this.Workspaces.Add(viewModel);
    this.SetActiveWorkspace(viewModel);
}

この時点ですべてがうまくいくはずです。ここで、各「ワークスペース」を新しいタブに表示したいので、マークアップしてTabControl同期しました。

<ContentControl Content="{Binding Path=Workspaces}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <TabControl IsSynchronizedWithCurrentItem="True"
                        ItemsSource="{Binding}"
                        Margin="4">
                <TabControl.ItemTemplate>
                    <DataTemplate>
                        <DockPanel Width="120">
                            <Button Command="{Binding Path=CloseCommand}"
                                    Content="X"
                                    Cursor="Hand"
                                    DockPanel.Dock="Right"
                                    Focusable="False"
                                    FontFamily="Courier"
                                    FontSize="10"
                                    FontWeight="Bold"
                                    Margin="0,1,0,0"
                                    Padding="4"
                                    VerticalContentAlignment="Bottom"
                                    Style="{DynamicResource
                                        ResourceKey={
                                            x:Static ToolBar.ButtonStyleKey}}"/>
                            <ContentPresenter
                                Content="{Binding Path=DisplayName}"
                                VerticalAlignment="Center"/>
                        </DockPanel>
                    </DataTemplate>
                </TabControl.ItemTemplate>
            </TabControl>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>

次に、外部リソース ファイルで、ビュー モデルの既定のビューを定義しました。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:l="clr-namespace:BigFileReader"
                    xmlns:lv="clr-namespace:BigFileReader.Views">
    <DataTemplate DataType="l:DefaultViewModel">
        <lv:DefaultView/>
    </DataTemplate>
</ResourceDictionary>

そのリソース ディクショナリをメイン ウィンドウに含めました。

<Window.Resources>
    <ResourceDictionary Source="MainWindowResources.xaml" />
</Window.Resources>

これで、各 のヘッダーが正常に表示されますTabItem。期待どおりに表示されますDisplayName

しかし、 のContentTemplateTabItemデフォルトのビューを選択しません。もちろんタイプの完全な名前である のとともにTextBlockを表示するだけです。ToString()DefaultViewModel

デフォルトのテンプレートが選択されないのはなぜですか?

4

1 に答える 1

4

これを変える:

<DataTemplate DataType="l:DefaultViewModel">
    <lv:DefaultView/>
</DataTemplate>

これに:

<DataTemplate DataType="{x:Type l:DefaultViewModel}">
    <lv:DefaultView/>
</DataTemplate>

それは私に一度起こりました。この単純な解決策を発見するためだけに、1時間ほど苦労しました。やってみて。

于 2013-08-16T15:14:48.960 に答える