简体   繁体   English

WPF中的DataTemplateSelector

[英]DataTemplateSelector in WPF

I want to switch between two views that have different bindings and controls. 我想在具有不同绑定和控件的两个视图之间切换。 Can I do this using DataTemplateSelector? 我可以使用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>

Actually, it depends on switching logic and how view models are designed. 实际上,这取决于切换逻辑以及视图模型的设计方式。 There can be more than one solution. 可以有多个解决方案。 Eg, here's sample without DataTemplateSelector at all, it is based on style trigger. 例如,这里的示例完全没有DataTemplateSelector ,它基于样式触发器。

View model: 查看模型:

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

XAML: 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 allows you to implement more sophisticated logic, but also has its own cons: if you want to get something from the view, you have to walk through the elements tree. DataTemplateSelector允许您实现更复杂的逻辑,但是也有其缺点:如果要从视图中获取某些内容,则必须遍历元素树。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 WPF datatemplateselector没有被调用 - WPF datatemplateselector not getting called WPF DataTemplateSelector 未使用 - WPF DataTemplateSelector is not used 在WPF中以编程方式将DataTemplateSelector与Treeview项绑定 - Binding DataTemplateSelector with treeview item programmatically in WPF WPF:当某个值发生变化时重新应用 DataTemplateSelector - WPF: Reapply DataTemplateSelector when a certain value changes 提供一个DataTemplateSelector运行时资源,如何? WPF / XAML - Supplying a DataTemplateSelector runtime resources, how? WPF/XAML 在DataTemplateSelector上使用DataTemplates的WPF字典的键始终为空值 - WPF Dictionary using DataTemplates on a DataTemplateSelector always having a null value for the key WPF-从DataTemplateSelector中获取一个DataGridCell的值 - WPF - Getting the value of one a DataGridCell from within DataTemplateSelector 如何在WPF中的DataTemplateSelector类中查找UserControl中的资源? - How to find a resource in a UserControl from a DataTemplateSelector class in WPF? LongListSelector和DataTemplateSelector - LongListSelector and DataTemplateSelector 引用父DataTemplateSelector的DataTemplateSelector中的DataTemplate? - DataTemplate within a DataTemplateSelector referencing the parent DataTemplateSelector?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM