DataTemplateSelector в WPF

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

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

person Mrg Gek    schedule 13.08.2015    source источник
comment
вы можете использовать селектор шаблонов или пользовательский элемент управления   -  person Joseph    schedule 13.08.2015
comment
Как вы планируете выбирать просмотры?   -  person Dennis    schedule 13.08.2015
comment
В моем MainView через ContextMenu по нажатию кнопки. И я хочу не только изменить стиль своих вкладок, но и изменить его контекст данных и элементы управления. Например, TabView1 имеет TextBox и DataGrid, привязанные к ViewModel1 и ObservableCollection1. TabView2 имеет только DataGrid, привязанный к ViewModel2 и ObservableCollection2.   -  person Mrg Gek    schedule 13.08.2015


Ответы (1)


На самом деле это зависит от логики переключения и от того, как устроены модели представлений. Может быть более одного решения. Например, вот образец вообще без 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 позволяет реализовать более сложную логику, но и имеет свои минусы: если вы хотите что-то получить из представления, вам придется пройтись по дереву элементов.

person Dennis    schedule 13.08.2015