移至ResourceDictionary时DataTemplate不起作用

时间:2018-12-29 15:58:26

标签: c# xaml uwp

我认为我试图将DataTemplate从ListView移到资源字典中,但它以某种方式破坏了绑定。

我验证了,当我对Textblock文本进行硬编码时,它会显示在列表视图中,并且看来列表视图数据源绑定正在工作,它只是无法显示我的数据。

这是字典:

<ResourceDictionary
    x:Class="Marathon.Resources.ListViewTemplate"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Marathon">

    <DataTemplate x:Key="LVTemplate" x:DataType="local:Result">
        <StackPanel Orientation="Horizontal" Height="Auto" Padding="12" AutomationProperties.Name="{x:Bind ID}">
            <TextBlock Text="{x:Bind ToString()}" VerticalAlignment="Center" Style="{ThemeResource BaseTextBlockStyle}" Foreground="White" Margin="12,0,0,0" FontSize="24"/>
        </StackPanel>
    </DataTemplate>
</ResourceDictionary>

这是我引用模板的方式:

<ListView Grid.Row="1" ItemsSource="{x:Bind VM.Results}" ItemTemplate="{StaticResource LVTemplate}" Background="#FF343434" >           
</ListView>

这是当我将其放在listview模板而不是字典中时的外观:

<ListView Grid.Row="1" ItemsSource="{x:Bind VM.Results}" Background="#FF343434" >
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="local:Result">
            <StackPanel Orientation="Horizontal" Height="Auto" Padding="12" AutomationProperties.Name="{x:Bind ID}">
                <TextBlock Text="{x:Bind ToString()}" VerticalAlignment="Center" Style="{ThemeResource BaseTextBlockStyle}" Foreground="White" Margin="12,0,0,0" FontSize="24"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

以下是它在ResourceDictionary中不在运行时的屏幕截图:

这是行不通的:

编辑: 这是我的App.xaml:

<Application
    x:Class="Marathon.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Marathon">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources/VCenterTextBox.xaml"/>
                <ResourceDictionary Source="Resources/KeypadButton.xaml"/>
                <ResourceDictionary Source="Resources/ListViewTemplate.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

</Application>

2 个答案:

答案 0 :(得分:1)

最好的方法是在App.xaml中添加引用,然后就可以在应用程序中的任何地方使用DataTemplate。

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Path/To/Your/ResourceFile/ListViewDataTemplate.xaml" />
            <ResourceDictionary Source="Another/Path/To/Your/ResourceFile/EGButtonTemplateStyle.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

答案 1 :(得分:1)

在ResourceDictionary中使用x:Bind时,您需要声明Dictionary部分并创建一个代码隐藏文件以实例化它:

<ResourceDictionary
    x:Class="Marathon.Resources.ListViewTemplate"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Marathon">

    <DataTemplate x:Key="LVTemplate" x:DataType="local:Result">
        <StackPanel Orientation="Horizontal" Height="Auto" Padding="12" AutomationProperties.Name="{x:Bind ID}">
            <TextBlock Text="{x:Bind ToString()}" VerticalAlignment="Center" Style="{ThemeResource BaseTextBlockStyle}" Foreground="White" Margin="12,0,0,0" FontSize="24"/>
        </StackPanel>
    </DataTemplate>
</ResourceDictionary>

隐藏代码:     使用Windows.UI.Xaml.Data;

namespace Marathon.Resources
{
  public partial class ListViewTemplate
  {
    public ListViewTemplate()
    {
      InitializeComponent();
    }
  }
}

App.xaml:

提示:像对象一样实例化模板很重要,这样才能调用分部类的构造函数和“ InitializeComponent()”。不要引用该文件。

<Application
    x:Class="Marathon.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Marathon">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>               
                <local:ListViewTemplate"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

</Application>

Resource dictionaries with {x:Bind}