为什么不是';对于我的视图模型,这个默认的DataTemplate正在被使用

本文关键字:默认 DataTemplate 模型 视图 于我的 我的 为什么不 | 更新日期: 2023-09-27 18:28:00

我声明了一个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);
}

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

但是,TabItemContentTemplate并没有选择默认视图,它只是显示了一个TextBlockDefaultViewModelToString(),当然这是类型的全名

为什么没有选择默认模板?

为什么不是';对于我的视图模型,这个默认的DataTemplate正在被使用

更改此项:

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

到此:

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

这件事发生在我身上一次。我挣扎了大约1个小时,才发现这个简单的解决方案。试试看。