将UserControl作为选项卡内容托管

时间:2010-11-16 21:49:32

标签: c# wpf mvvm datatemplate

尝试在TabControl中的Tab项中将UserControl作为选项卡内容托管时出现问题。

我的代码结构如下:

我有一个视图模型,应该通过DataTemplate渲染到View中。

<DataTemplate x:Key="TabItemContentTemplate" DataType="{x:Type ViewModels:MyViewModel}">
  <Views:MyView />
</DataTemplate>

我想提出这个观点    一个TabControl(实际上是一个    XamTabControl,但无论如何,    问题仍然存在。)

   <UserControl>
        <UserControl.Resources>
        <DataTemplate x:Key="TabItemHeaderTemplate">
                <StackPanel>
                  <TextBlock Text="{Binding Path=Name}" />
                  <TextBlock Text="{Binding Path=Description}"/>              
                </StackPanel>
        </DataTemplate>
            <DataTemplate x:Key="TabItemContentTemplate" DataType="{x:Type ViewModels:MyViewModel}">
              <Views:MyView />
            </DataTemplate>
        <Style x:Key="TabItemContainerStyle" TargetType="Controls:TabItemEx">
          <Setter Property="Header" Value="{Binding}"/>
          <Setter Property="HeaderTemplate"
                  Value="{DynamicResource TabItemHeaderTemplate}"/>
          <Setter Property="Content" Value="{Binding}"/>
          <Setter Property="ContentTemplate"
                  Value="{DynamicResource TabItemContentTemplate}"/>
        </Style>                   
      </UserControl.Resources>
      <Grid >
       <Controls:XamTabControl 
        ItemsSource="{Binding Items}"
        ItemContainerStyle="{DynamicResource TabItemContainerStyle}"
        TabStripPlacement="Left"
        TabLayoutStyle="SingleRowAutoSize"
        AllowTabClosing="True"                               
        Grid.Row="1"
        TabItemCloseButtonVisibility="WhenSelectedOrHotTracked">
        </Controls:XamTabControl>
      </Grid>
    </UserControl>

问题是内容无法呈现。 Tab标题确实呈现正常,但是标签中没有内容。

我很确定问题出在View / Viewmodel映射中,因为当我将模板更改为以下内容时,我确实会获得内容呈现:

<DataTemplate x:Key="TabItemHeaderTemplate">
  <Grid>
    <TextBlock Text="{Binding Header}"/>
    <Ellipse Fill="Red" Width="40" Height="40" Margin="0,20,0,0"/>
  </Grid>
</DataTemplate>
<DataTemplate x:Key="TabItemContentTemplate">
  <Ellipse Fill="Green"/>
</DataTemplate>
<Style x:Key="TabItemContainerStyle" TargetType="Controls:TabItemEx">
  <Setter Property="Header" Value="{Binding}"/>
  <Setter Property="HeaderTemplate"
          Value="{StaticResource TabItemHeaderTemplate}"/>
  <Setter Property="Content" Value="{Binding}"/>
  <Setter Property="ContentTemplate"
          Value="{StaticResource TabItemContentTemplate}"/>
</Style>

有谁知道我在这里做错了什么?

提前感谢!

3 个答案:

答案 0 :(得分:2)

如果我理解你是正确的,那么我认为问题是你试图将属性从VM绑定到视图

  <Setter Property="Header" Value="{Binding}"/>                    
  <Setter Property="HeaderTemplate" Value="{StaticResource TabItemHeaderTemplate}"/>
    <DataTemplate x:Key="TabItemHeaderTemplate">                       
            <StackPanel>                       
              <TextBlock Text="{Binding Path=Name}" />                       
              <TextBlock Text="{Binding Path=Description}"/>                                     
            </StackPanel>                       
    </DataTemplate>

同时尝试使用相同的绑定来“替换”VM和视图

      <Setter Property="Content" Value="{Binding}"/>                            
      <Setter Property="ContentTemplate" Value="{StaticResource TabItemContentTemplate}"/>
      <DataTemplate x:Key="TabItemContentTemplate" DataType="{x:Type ViewModels:MyViewModel}">                             
          <Views:MyView />                             
      </DataTemplate>

在第二个示例中,您没有将vm映射到具有相同绑定的视图,因此您可以看到绿色椭圆。

答案 1 :(得分:0)

我已设法使其与MyView.xaml一起使用,如下所示:

<UserControl x:Class="WpfApplication27.MyView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             >
    <StackPanel>
        <TextBox Text="{Binding Path=Name}"></TextBox>
        <TextBox Text="{Binding Path=Description}"></TextBox>
    </StackPanel>
</UserControl>

alt text

答案 2 :(得分:0)

解决了这个问题。由于重命名操作,BAML已损坏! :(