大家好,欢迎来到另一个嵌套的DataTemplate问题!
在这一本书中,我想有一个这样的DataTemplate,写在ResourceDictionary上:
<DataTemplate x:Key="Vector3Template">
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="X" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding X}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="Y" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding Y}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<xctk:DoubleUpDown Tag="Z" Style="{StaticResource DoubleUpDownStyle}" Value="{Binding Z}"/>
</StackPanel>
</StackPanel>
</DataTemplate>
被带有边框的DataTemplate包围,如下所示,也写在ResourceDictionary上(将来还会有更多元素):
<DataTemplate x:Key="ComponentTemplate">
<Border Margin="5" BorderThickness="2" BorderBrush="Gray"/>
</DataTemplate>
为什么我要这个,你问?好吧,我试图显示一个名为_components的IComponent的ObservableCollection,并且我希望所有实例共享相同的Borders,但其核心特定于继承自IComponent的每个类类型。
为了显示具有不同类型的列表,我在UserControl上使用以下代码:
<Grid x:Name="LayoutRoot" Background="White">
<ScrollViewer HorizontalScrollBarVisibility="Disabled" VerticalScrollBarVisibility="Auto">
<StackPanel>
<ListView x:Name="_componentsList"
ItemsSource="{Binding Components}"
HorizontalContentAlignment="Stretch">
<ListView.Resources>
<DataTemplate DataType="{x:Type models:Transform}">
<ContentControl Content="{StaticResource ComponentTemplate}" ContentTemplate="{StaticResource TransformTemplate}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type models:Vector3}">
<ContentPresenter ContentTemplate="{StaticResource Vector3Template}"/>
</DataTemplate>
</ListView.Resources>
</ListView>
</StackPanel>
</ScrollViewer>
尝试使用Prism 6.3构建该系统,并且几乎没有任何代码隐藏,我拥有的每个C#代码都仅用于模型,因此到目前为止,这里还没有真正的逻辑。
这可能吗?为何如此?几天前我已经开始使用WPF,但仍有很多东西要学习。
答案 0 :(得分:0)
我相信您正在寻找的只是使用DataTemplateSelector,其中所使用的DataTemplate由数据确定。您可以找到完整的教程here。设置DataTemplateSelector之后,您只需将其作为DataTemplate传递给您的控件即可。
public class PropertyDataTemplateSelector : DataTemplateSelector
{
public DataTemplate DefaultnDataTemplate { get; set; }
public DataTemplate BooleanDataTemplate { get; set; }
public DataTemplate EnumDataTemplate { get; set; }
public override DataTemplate SelectTemplate(object item,
DependencyObject container)
{
DependencyPropertyInfo dpi = item as DependencyPropertyInfo;
if (dpi.PropertyType == typeof(bool))
{
return BooleanDataTemplate;
}
if (dpi.PropertyType.IsEnum)
{
return EnumDataTemplate;
}
return DefaultnDataTemplate;
}
}