DataTemplate не работает при перемещении в ResourceDictionary - PullRequest
0 голосов
/ 29 декабря 2018

Я пытался переместить DataTemplate из ListView в словарь ресурсов, и, как мне кажется, он каким-то образом нарушил привязки.

Я убедился, что при жестком кодировании текста Textblock он отображается в виде списка, и кажется,привязка источника данных listview работает, она просто не может отображать мои данные.

Вот словарь:

<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 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 голосов
/ 30 декабря 2018

При использовании x: Bind внутри ResourceDictionary вам необходимо объявить частичный словарь и создать файл с выделенным кодом, чтобы создать его экземпляр:

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

Ресурсные словари с {x: Bind}

0 голосов
/ 29 декабря 2018

Лучший способ - добавить ссылку в ваш 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...