在UWP的列表视图中显示不同的数据模板

时间:2018-05-05 22:49:16

标签: c# listview uwp windows-mobile uwp-xaml

我正在使用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 :(得分:0)

我认为在视图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找到你要查找的元素,并且可能使用此选择器将空数据模板返回到列表视图

希望这会对你有所帮助。