如何在ListView中使用静态资源进行自动DataTemplate解析

时间:2016-08-09 05:31:45

标签: wpf listview

我有

<ListView ItemsSource="{Binding Path=Fruit}">
    <ListView.Resources>
        <DataTemplate DataType="Apple">
            <TextBlock Text="This is an apple"/>
        </DataTemplate>
        <DataTemplate DataType="Orange">
            <TextBlock Text="This is an orange"/>
        </DataTemplate>
        <DataTemplate DataType="Potato">
            <TextBlock Text="Lets assume potato is a fruit"/>
        </DataTemplate>
    </ListView.Resources>

水果在哪里

ObservableCollection<IFruit> Fruit = new Observable Collection<IFruit>();
public class Apple:IFruit{ }
public class Orange:IFruit{ }
public class Potato:IFruit{ }

这很好用。但由于所有单独的Fruit标记都非常大,我宁愿将DataTemplate移动到他们自己的ResourceDictionary中的单独文件中。 我想做的是

<ListView ItemsSource="{Binding Path=Fruit}">
    <ListView.Resources>
        <StaticResource ResourceKey="AppleDataTemplate" />
        <StaticResource ResourceKey="OrangeDataTemplate" />
        <StaticResource ResourceKey="PotatoDataTemplate" />
    </ListView.Resources>

DataTemplates是

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
                    xmlns:models="clr-namespace:MyApp.Models">
    <DataTemplate x:Key="AppleDataTemplate" DataType="Apple">
        <TextBlock Text="This is an apple"/>
    </DataTemplate>
</ResourceDictionary>

但是这会抛出

{"'XAML Node Stream: Value of 'System.Windows.Markup.StaticResourceHolder' must follow a StartObject and StartMember.' Line number '130' and line position '18'."}

其中Line number '130'<StaticResource>元素。

我的问题是如何在ListView中使用静态资源进行自动DataTemplate解析?

根据MSDNStartObjectStartMember是否应隐含这些元素?与文档中定义<Party.Favors>的方式类似?

1 个答案:

答案 0 :(得分:1)

您可以通过执行以下操作将DataTemplate ResourceDictionary合并到ListView.Resources中:

<ListView ItemsSource="{Binding Path=Fruit}">
    <ListView.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="AppleTemplate.xaml" />
                <ResourceDictionary Source="OrangeTemplate.xaml" />
                <ResourceDictionary Source="PotatoTemplate.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </ListView.Resources>
</ListView>

然后,DataTemplate将可用于ListView。或者,您可以在更高级别合并这些ResourceDictionary(即您UserControl已定义的ListView XAML文件。

您可能希望从x:Key中的DataTemplate定义中删除ResourceDictionary