1

我对 WPF 很陌生,正在使用这个示例作为起点编写一个应用程序 http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090025

我在任何时候都只能看到一个工作区,所以我想摆脱 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 来设置活动工作区 - 这是我感兴趣的活动工作区,但我不明白 TabControl 正在做什么,除了它与 IsSynchronizedWithCurrentItem="True" 有关

从这里调用模板(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 如何显示属性Workspaces,正如您所说,它是ObservableCollectionViewModels 的一个。

因此,WorkspacesTemplate上面说,在选项卡控件中显示所有这些 ViewModel,并且对于每个 ViewModel,使用ClosableTabItemTemplate来在选项卡中显示 ViewModel。

由于您一次只希望一个工作区可见,因此您不需要从 ViewModel 公开一组工作区,也不需要选项卡控件来显示它们。您只需从 ViewModel 中公开一个当前工作区并提供一些 XAML 来显示它。

如果您仍然想使用模板来包装 ViewModel,那么可以,您可以使用 aContentControl来调用模板:

<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它间接使用集合的默认值,并CollectionView具有选定项的概念。这一切尽在眼前。WorkspacesCollectionView

我现在不用担心这些,只需从您的 ViewModel 中自己公开一个工作区。

编辑2:

出现关闭按钮是因为您ContentTemplateHeaderedContentControl. 无论Content.

要使模板仅在 中有数据时出现Content,请改为隐式模板。如果将 a 添加DataType到模板定义(并删除键),则告诉 WPF 始终使用此模板来显示该数据类型的对象。

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

然后,您可以从HeaderedContentControl. 简单的设置Content就足够调用模板了,如果没有Content,就没有模板。

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

(ps。如果你不使用的标题HeaderedContentControl,你还不如只使用一个沼泽标准ContentControl

于 2012-04-16T12:32:54.507 回答