开发者

DataTemplate for a DataType - how to override this DataTemplate in a particular ListBox?

开发者 https://www.devze.com 2023-01-23 06:59 出处:网络
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

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?


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:

DataTemplate for a DataType - how to override this DataTemplate in a particular ListBox?

0

精彩评论

暂无评论...
验证码 换一张
取 消