Отображать различные шаблоны данных в виде списка в UWP - PullRequest
0 голосов
/ 06 мая 2018

Я работаю с Visual Studio 2017. И я показываю два типа элементов списка в виде списка. Это означает два разных пользовательских шаблона данных. И это моя страница xaml

<Page
    x:Class="InboxModule.ChatMessages"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:InboxModule"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Page.Resources>

        <DataTemplate x:Key="leftTemplate">
            <StackPanel Background="Aqua" Orientation="Horizontal">
                <TextBlock Text="left"/>
                <TextBlock Text="{Binding LastMessage}"/>
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="rightTemplate">
            <Grid Background="White">
                <TextBlock Text="right"/>
            </Grid>
        </DataTemplate>

        <local:MyDataTemplateSelector x:Key="myPremiumUserDataTemplateSelector" />
    </Page.Resources>

    <Grid>
        <ListView x:Name="myListView" ItemTemplateSelector="{StaticResource myPremiumUserDataTemplateSelector}">
        </ListView>                 
    </Grid>
</Page>

А мой код xaml.cs такой

public sealed partial class ChatMessages : Page
{
    public ChatMessages()
    {
        this.InitializeComponent();

        List<chat> users = new List<chat>();
        for (int i = 0; i < 10; ++i)
        {
            var user = new chat { NewMessages = "Name is mj "};

            if (i == 2 || i == 4)
            {
                user.Name = "Alex Doe";
            }
            users.Add(user);
        }
        myListView.ItemsSource = users;
    }

    private void BackButton_Click(object sender, RoutedEventArgs e)
    {
        Frame.Navigate(typeof(InboxChat));
    }
}

И мой класс MyDataTemplateSelector это

public class MyDataTemplateSelector : DataTemplateSelector
{
    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        FrameworkElement elemnt = container as FrameworkElement;
        chat user = item as chat;
        if (user.Name == "Alex Doe")
        {
            return elemnt.FindName("leftTemplate") as DataTemplate;
        }
        else
        {
            return elemnt.FindName("rightTemplate") as DataTemplate;
        }       
    }
}

Я пытался использовать фиктивные значения. И я пытался часами .. но я не мог найти решение. Пожалуйста, помогите мне решить эту проблему. Большое спасибо !!

1 Ответ

0 голосов
/ 06 мая 2018

Я думаю, вам нужно передать шаблоны данных селектору, когда он инициализируется в представлении XAML. Вот как это сделать.

Ваш селектор будет выглядеть так (в основном, принимая шаблоны данных в качестве свойств в классе):

public class MyDataTemplateSelector : DataTemplateSelector
    {
        public DataTemplate DataTemplate1 { get; set; }

        public DataTemplate DataTemplate2 { get; set; }

        protected override DataTemplate SelectTemplateCore(object item)
        {
            if ([Condition 1] == true)
                return DataTemplate1;

            if ([Condition 2] == true)
                return DataTemplate2;

            return base.SelectTemplateCore(item);
        }

        protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
        {
            return SelectTemplateCore(item);
        }
    }

Затем, чтобы использовать этот селектор, объявите его так в XAML вашего представления:

<Page.Resources>
    <MyDataTemplateSelector x:Key="MySelector">
      <MyDataTemplateSelector.DataTemplate1>
           <DataTemplate .... />
      <MyDataTemplateSelector.DataTemplate1>

      <MyDataTemplateSelector.DataTemplate2>
           <DataTemplate .... />
      <MyDataTemplateSelector.DataTemplate2>
    </MyDataTemplateSelector>
</Page.Resources>

вы будете в основном объявлять эти шаблоны данных в коде xaml, инициализирующем ваш селектор.

Редактировать: По той причине, что ваш код не работал: я подозреваю, что это потому, что он не может найти элемент, который вы ищете с FindName и, вероятно, возвращает нулевой шаблон данных обратно в представление списка, используя этот селектор .

Надеюсь, это поможет вам.

...