是否可以在另一个DataTemplate周围有一个DataTemplate?

时间:2018-11-14 21:24:00

标签: wpf prism datatemplate resourcedictionary contentcontrol

大家好,欢迎来到另一个嵌套的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,但仍有很多东西要学习。

1 个答案:

答案 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;
    }
}