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

发布于 2024-09-30 10:11:28 字数 487 浏览 10 评论 0原文

我为我的宠物项目中的一些数据类型创建了几个数据模板。 这些数据模板非常酷,因为它们像魔法一样工作,无论何时何地出现在 UI 中,都会神奇地改变数据类型实例的外观。 现在我希望能够在一个特定的列表框中更改这些数据类型的数据模板。这是否意味着我必须停止依赖 WPF 自动将数据模板应用到数据类型,并将 ax:Key 分配给 DataTemplates,然后使用该键在 UI 中应用 Template/ItemTemplate?

ListBox 包含各种 DataType 的项目(全部派生自公共基类),就像现在一样,无需指定 TemplateSelector 即可神奇地工作,因为正确的模板是由 listBox 中项目的实际数据类型选择的。如果我选择使用 x:Key 来应用 DataTemplates,我是否需要编写 TemplateSelector?

我对此很陌生,只尝试使用 DataTemplates。有那么一刻我想,哇,多酷啊!然后我想要在不同的列表框中为相同的数据类型使用不同的数据模板,哎呀,我做不到:-) 请帮忙?

I have created several DataTemplates for some of the DataTypes in my pet project.
These data templates are really cool as they work like magic, magically transforming the look of the instances of the data types whenever and wherever they show up in the UI.
Now I want to be able to change the DataTemplate for these DataTypes in one particular ListBox. Does this mean I have to stop relying on WPF automatically applying the data template to the data types and assign a x:Key to the DataTemplates and then apply the Template/ItemTemplate in the UI using that key?

A ListBox contains items of various DataTypes (all derived from a common base class) and as it is now, all magically works without specifying a TemplateSelector, as the correct template is chosen by the actual data type of the item in the listBox. If I went for using the x:Key to apply DataTemplates, would I then need to write a TemplateSelector?

I am new to this and only experimenting with DataTemplates. One moment I think, wow, how cool! And then I want a different data template for the same data type in a different list box and ooops, I can't do it :-) Help please?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

会发光的星星闪亮亮i 2024-10-07 10:11:28

您可以专门为您的 ListBox 指定一个 ItemTemplate

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

或者,如果您已经在 ResourceDictionary 中定义了 DataTemplate > 某处:

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

然后您可以在 ListBox 上引用它,使用:

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

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


示例 来响应评论

该示例下面演示了为窗口的数据类型(在本例中为 String)定义默认 DataTemplate,然后在列表框中覆盖它:

<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>

这会产生以下 UI:

示例显示

You can specify an ItemTemplate specifically for your ListBox:

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

Or alternatively, if you have already defined your DataTemplate in a ResourceDictionary somewhere:

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

Then you can reference it on the ListBox using:

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

You do not need to write a template selector for either of these approaches to work


Example in response to comments

The example below demonstrates defining a default DataTemplate for a data type (in this case, String) for a window and then overridding it within a listbox:

<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>

This produces the following UI:

Example Display

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文