Wpf XAML:为扩展程序中表示的ViewModel创建数据模板

Wpf XAML:为扩展程序中表示的ViewModel创建数据模板,wpf,xaml,user-controls,datatemplate,expander,Wpf,Xaml,User Controls,Datatemplate,Expander,假设我有一个类似于Expander的自定义控件,并将在该Expander中显示多种类型的对象。我想为每种类型的对象定义一个DataTemplate 现在我想在未展开时显示特定信息,在展开时显示其他信息 通常使用expander,它只显示绑定到Header属性的内容 我可以在DataTemplate中为每个视图定义两个区域吗 有没有其他绝妙的方法可以做到这一点?试试这个: <DataTemplate x:Key="ExpanderItemDataTemplate"> &

假设我有一个类似于Expander的自定义控件,并将在该Expander中显示多种类型的对象。我想为每种类型的对象定义一个DataTemplate

现在我想在未展开时显示特定信息,在展开时显示其他信息

通常使用expander,它只显示绑定到Header属性的内容

我可以在DataTemplate中为每个视图定义两个区域吗

有没有其他绝妙的方法可以做到这一点?

试试这个:

<DataTemplate x:Key="ExpanderItemDataTemplate">
        <Grid x:Name="LayoutRoot">
            <Grid x:Name="ExpandedContent" />
            <Grid x:Name="CollapsedContent" />
        </Grid>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding IsExpanded, RelativeSource={RelativeSource AncestorType=local:YourCustomControl}}"
                         Value="True">
                <Setter Property="Visibility"
                        TargetName="ExpandedContent"
                        Value="Visible" />
                <Setter Property="Visibility"
                        TargetName="CollapsedContent"
                        Value="Collapse" />
            </DataTrigger>
            <DataTrigger Binding="{Binding IsExpanded, RelativeSource={RelativeSource AncestorType=local:YourCustomControl}}"
                         Value="False">
                <Setter Property="Visibility"
                        TargetName="ExpandedContent"
                        Value="Collapse" />
                <Setter Property="Visibility"
                        TargetName="CollapsedContent"
                        Value="Visible" />
            </DataTrigger>
        </DataTemplate.Triggers>


您是否考虑过简单地使用
选项卡控件
? 例如,您可以添加两个选项卡并设置它们的样式。以下是选项卡样式的代码:

    <Style TargetType="{x:Type TabPanel}">
        <!--Whatever you need for tab position (here center) -->
        <Setter Property="HorizontalAlignment" Value="Center" />
    </Style>


这是我自然的想法。 例如,您可以将此代码扩展为添加一个触发器,当您单击唯一可见的选项卡时更改所选选项卡。
无论如何,您描述的行为似乎更适合
选项卡控件
而不是
扩展器

,因此,如果我理解正确,它不是展开和折叠,而是在以两种不同方式显示相同的数据之间切换?@Joel是的,您可以这么说。它也可以被视为一个标题,包含更多信息,而不仅仅是一个属性。实际上,我将把这个样式应用到一个列表框中,并让selectedItem展开,而其他元素则显示最相关的信息。因此,我将为我要使用的每种类型创建一个,并将正确的视图添加到每个网格行中?我可以工作。顺便说一句,你是冰岛人吗?我不是,但我真的很喜欢这个词。我能换个说法吗?将触发器放在控件中,并将其指向将绑定的dataTemplate内的命名区域?这是我真的不想做的。谢谢你的建议,如果我把这件事搞得够糟的话,它可以工作,但我不想没有实际的选项卡,所以从Itemscontrol开始可能会更容易。
           <ControlTemplate x:Key="TabItemTemplate" TargetType="{x:Type TabItem}">
                <!-- Place whatever control you want for design (grid, dockpanel... -->
                <!-- And then the triggers you'd need for, here, color if selected or not, as an example -->
                <ControlTemplate.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter TargetName="Border" Property="Background" Value="Blue" />
                    </Trigger>
                    <Trigger Property="IsSelected" Value="False">
                        <Setter TargetName="Border" Property="Background" Value="WhiteSmoke" />
                    </Trigger>

                </ControlTemplate.Triggers>
            </ControlTemplate>