为什么不是';对于我的视图模型,这个默认的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
但是,TabItem
的ContentTemplate
并没有选择默认视图,它只是显示了一个TextBlock
和DefaultViewModel
的ToString()
,当然这是类型的全名
为什么没有选择默认模板?
更改此项:
<DataTemplate DataType="l:DefaultViewModel">
<lv:DefaultView/>
</DataTemplate>
到此:
<DataTemplate DataType="{x:Type l:DefaultViewModel}">
<lv:DefaultView/>
</DataTemplate>
这件事发生在我身上一次。我挣扎了大约1个小时,才发现这个简单的解决方案。试试看。