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