如何在特定的地方禁用DataTemplate?

时间:2014-01-22 18:01:09

标签: wpf datatemplate

考虑以下模型:

var model = new object[] { "Ala ma kota", DateTime.Now };

现在,让我们假设,我们为ListBox显示以下DataTemplates显示此模型:

<ListBox ItemsSource="{Binding Data}">
    <ListBox.Resources>
        <DataTemplate DataType="{x:Type sys:String}">
            <StackPanel Orientation="Horizontal">
                <TextBlock>String:</TextBlock>
                <TextBlock Text="{Binding}" />
            </StackPanel>
        </DataTemplate>

        <DataTemplate DataType={x:Type sys:DateTime}">
            <StackPanel Orientation="Horizontal">
                <TextBlock>Data i czas:</TextBlock>
                <Calendar DisplayDate={Binding Mode=OneWay}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.Resources>
</ListBox>

如果我们运行这样的程序,将会实现非常有趣的效果:

Too much styling

有没有办法在某个级别禁用DataTemplate?我想在第二个DataTemplate中“阻止”它,这样日历就会正确显示。

1 个答案:

答案 0 :(得分:1)

我能想到的一种方法是 利用WPF中的资源查找行为 。它遍历Visual树,直到找到控件的默认资源。

您可以在DateTime的DataTemplate中为字符串本地定义资源,以便它在本地应用于您的DateTime模板,而对于其他人,它将继续表现相同:

            <DataTemplate DataType="{x:Type sys:DateTime}">
                <StackPanel Orientation="Horizontal">
                    <StackPanel.Resources>
                        <DataTemplate DataType="{x:Type sys:String}">
                            <TextBlock Text="{Binding}"/>
                        </DataTemplate>
                    </StackPanel.Resources>
                    <TextBlock>Data i czas:</TextBlock>
                    <Calendar DisplayDate="{Binding Mode=OneWay}" />
                </StackPanel>
            </DataTemplate>

输出:

enter image description here