Размещение UserControl в виде содержимого вкладки - PullRequest
0 голосов
/ 17 ноября 2010

У меня проблема при попытке разместить UserControl в качестве содержимого вкладки в элементе вкладки в TabControl.

Мой код структурирован следующим образом:

У меня есть модель представления, которая должна быть преобразована в представление через шаблон данных.

<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>

Проблема в том, что контент не отображается. Заголовок вкладки отображается нормально, однако на вкладках нет содержимого.

Я вполне уверен, что проблема заключается в отображении 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 ]

2 голосов
/ 17 ноября 2010

Если я правильно вас понял, то, я думаю, проблема в том, что вы пытаетесь привязать свойства виртуальной машины к представлению

  <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>

и одновременно пытаетесь использовать ту же привязку, чтобы «заменить» виртуальную машинус представлением

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

Во втором примере вы не сопоставляете виртуальную машину с представлением с той же привязкой, поэтому вы видите зеленый эллипс.

0 голосов
/ 17 ноября 2010

Решил это.BAML был поврежден из-за операции переименования!(

0 голосов
/ 17 ноября 2010

Мне удалось заставить его работать с 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

...