簡體   English   中英

在UWP的列表視圖中顯示不同的數據模板

[英]Display different data templates on a list view in UWP

我正在使用Visual Studio2017。並且我想在列表視圖中顯示兩種類型的列表視圖項。 這意味着兩個不同的自定義數據模板。 這是我的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;
        }       
    }
}

我試圖使用偽值。 而且我已經嘗試了幾個小時..但是我找不到解決方案。 請幫我解決這個問題。 非常感謝你!!

我認為您需要在視圖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找到您要查找的元素,並且可能使用此選擇器將空數據模板返回到列表視圖。

希望這對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM