代码之家  ›  专栏  ›  技术社区  ›  Peter Perháč

数据类型的数据模板-如何在特定列表框中重写此数据模板?

  •  3
  • Peter Perháč  · 技术社区  · 14 年前

    我已经为我的宠物项目中的一些数据类型创建了几个数据模板。 这些数据模板非常酷,因为它们像魔术一样工作,无论何时何地,只要数据类型出现在用户界面中,它们都会神奇地转换数据类型实例的外观。 现在,我希望能够在一个特定的列表框中更改这些数据类型的数据模板。这是否意味着我必须停止依赖于WPF自动将数据模板应用于数据类型,并为数据模板分配一个x:key,然后使用该key在UI中应用模板/项模板?

    列表框包含各种数据类型的项(所有这些项都是从公共基类派生的),现在,由于正确的模板是由列表框中项的实际数据类型选择的,因此所有这些项都可以在不指定TemplateSelector的情况下神奇地工作。如果我使用x:key来应用数据模板,那么我是否需要编写一个模板选择器?

    我对这个还不熟悉,只是在尝试数据模板。我想,哇,多酷啊!然后,我想在不同的列表框和OOOP中为相同的数据类型使用不同的数据模板,我不能这样做:-)请帮助?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Steve Greatrex    14 年前

    您可以指定 ItemTemplate 专门为您 ListBox :

    <ListBox>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <!-- your template here -->
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    

    或者,如果您已经定义了 DataTemplate 在一个 ResourceDictionary 在某个地方:

    <DataTemplate x:Key="MyTemplate">
          <!-- your template here -->
    </DataTemplate>
    

    然后你可以在 列表框 使用:

    <ListBox ItemTemplate="{StaticResource MyTemplate}" />
    

    您不需要为这些方法中的任何一种工作编写模板选择器。


    例子 回应评论

    下面的示例演示如何定义默认值 数据模板 对于数据类型(在本例中, String )对于一个窗口,然后在列表框中重写它:

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <DataTemplate DataType="{x:Type sys:String}">
                <Rectangle Height="10" Width="10" Margin="3" Fill="Red" />
            </DataTemplate>
        </Window.Resources>
        <Grid>
            <ListBox>
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Rectangle Height="10" Width="10" Margin="3" Fill="Blue" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
    
                <sys:String>One</sys:String>
                <sys:String>Two</sys:String>
                <sys:String>Three</sys:String>
            </ListBox>
        </Grid>
    </Window>
    

    这将生成以下用户界面:

    Example Display