2015-08-13 1 views
0

Я хочу переключиться между двумя представлениями, которые имеют разные привязки и элементы управления. Могу ли я сделать это с помощью DataTemplateSelector?DataTemplateSelector в WPF

<TabControl 
     ItemsSource="{Binding Items}" SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay}"> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <DockPanel> 
        <TextBlock Text="{Binding TabName}"><TextBlock.Background><SolidColorBrush /></TextBlock.Background></TextBlock> 
        <Button Name="btnDelete" DockPanel.Dock="Right" Margin="5,0,0,0" Padding="0" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type TabItem}}, Path=Name}" BorderBrush="#00000000"> 
         <Image Source="/WPF_AccApp;component/Images/11.gif" Height="11" Width="11"></Image> 
        </Button> 
        <DockPanel.Background> 
         <SolidColorBrush /> 
        </DockPanel.Background> 
       </DockPanel> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
       <DataTemplate> 
         <y:TabView /> //Here I want to have two diferent views 
        </DataTemplate> 
      </TabControl> 
+0

Вы можете использовать селектор шаблонов или элемент управления пользователя – Joseph

+0

Как вы планируете выбирать виды? – Dennis

+0

В моем MainView через ContextMenu на нажатие кнопки. И я хочу не только изменить стиль моих вкладок, но и изменить его datacontext и элементы управления. Например, TabView1 имеет TextBoxes и DataGrid, привязанные к ViewModel1 и ObservableCollection1. TabView2 имеет только DataGrid, который привязан к ViewModel2 и ObservableCollection2. –

ответ

0

На самом деле это зависит от логики коммутации и того, как разработаны модели просмотра. Может быть несколько решений. Например, здесь образец без DataTemplateSelector вообще, он основан на триггере стиля.

Вид модели:

public class ItemVm 
{ 
    public string Name { get; set; } 
    public bool IsSelected { get; set; } 
    public int X { get; set; } 
    public int Y { get; set; } 
} 

XAML:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <!-- This one chooses the view --> 
    <CheckBox x:Name="ViewSelector" Content="View shapes"/> 

    <TabControl Grid.Row="1" ItemsSource="{Binding}"> 
     <TabControl.Resources> 
      <DataTemplate x:Key="TextualTemplateKey"> 
       <StackPanel> 
        <TextBlock Text="{Binding X}"/> 
        <TextBlock Text="{Binding Y}"/> 
       </StackPanel> 
      </DataTemplate> 
      <DataTemplate x:Key="ShapesTemplateKey"> 
       <Rectangle Fill="Green" Width="{Binding X}" Height="{Binding Y}"/> 
      </DataTemplate> 
     </TabControl.Resources> 
     <TabControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Name}"/> 
      </DataTemplate> 
     </TabControl.ItemTemplate> 
     <TabControl.ItemContainerStyle> 
      <Style TargetType="{x:Type TabItem}"> 
       <Setter Property="IsSelected" Value="{Binding IsSelected}"/> 
       <Setter Property="ContentTemplate" Value="{StaticResource TextualTemplateKey}"/> 
       <Style.Triggers> 
        <!-- When "View shapes" is checked, we're changing data template to a new one --> 
        <DataTrigger Binding="{Binding IsChecked, ElementName=ViewSelector}" Value="True"> 
         <Setter Property="ContentTemplate" Value="{StaticResource ShapesTemplateKey}"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </TabControl.ItemContainerStyle> 
    </TabControl> 
</Grid> 

DataTemplateSelector позволяет реализовать более сложную логику, но и имеет свои минусы: если вы хотите получить что-то с точки зрения, вы должны пройти через дерево элементов.

 Смежные вопросы

  • Нет связанных вопросов^_^