Xamarin的Telerik UI:找不到RadListView绑定的属性

问题描述 投票:0回答:1

我正在使用Telerik UI在Xamarin上开发Android应用程序。

当尝试将属性绑定到RadListView中的Telerik ListViewTextCell时出现以下错误:

[0:] Binding: 'Author' property not found on 'Book', target property: 'Telerik.XamarinForms.DataControls.ListView.ListViewTextCell.Detail'

即使在最小的情况下也会发生这种情况。下面是一个示例,主要来自ListView文档本身。

PageTest.cs

using System.Collections.Generic;
using System.ComponentModel;
using Xamarin.Forms;
using Telerik.XamarinForms.DataControls;
using Telerik.XamarinForms.DataControls.ListView;

namespace MyTelerikApp
{
    [DesignTimeVisible(false)]
    public partial class PageTest : ContentPage
    {
        public PageTest()
        {
            InitializeComponent();
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
            var listView = new RadListView
            {
                ItemsSource = new ViewModel().Source,
                ItemTemplate = new DataTemplate(() =>
                {
                    var cell = new ListViewTextCell
                    {
                        TextColor = Color.Black,
                        DetailColor = Color.Gray,
                    };

                    cell.SetBinding(ListViewTextCell.TextProperty, new Binding(nameof(Book.Title)));
                    cell.SetBinding(ListViewTextCell.DetailProperty, new Binding(nameof(Book.Author)));

                    return cell;
                }),
                LayoutDefinition = new ListViewLinearLayout { ItemLength = 70 }
            };
            MainPageContent.Children.Add(listView);
        }
    }
}

public class Book
{
    public string Title { get; set; }
    public string Author { get; set; }
}

public class ViewModel
{
    public ViewModel()
    {
        this.Source = new List<Book>{
            new Book{ Title = "The Fault in Our Stars ",  Author = "John Green"},
            new Book{ Title = "Divergent",  Author = "Veronica Roth"},
            new Book{ Title = "Gone Girl",  Author = "Gillian Flynn"},
            new Book{ Title = "Clockwork Angel",  Author = "Cassandra Clare"},
            new Book{ Title = "The Martian",  Author = "Andy Weir"},
            new Book{ Title = "Ready Player One",  Author = "Ernest Cline"},
            new Book{ Title = "The Lost Hero",  Author = "Rick Riordan"},
            new Book{ Title = "All the Light We Cannot See",  Author = "Anthony Doerr"},
            new Book{ Title = "Cinder",  Author = "Marissa Meyer"},
            new Book{ Title = "Me Before You",  Author = "Jojo Moyes"},
            new Book{ Title = "The Night Circus",  Author = "Erin Morgenstern"},
        };
    }

    public List<Book> Source { get; set; }
}

PageText.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="GeoGIS.views.PageTest">

    <StackLayout x:Name="MainPageContent">
    </StackLayout>

</ContentPage>

经过一些搜索之后,似乎有必要使用BindingContext,但是我也无法使它正常工作。

xamarin xamarin.forms telerik
1个回答
0
投票

我没有从您的代码中找到BindingContext。而且我想您把ContentPage(XAML和C#)的两种用法混淆了。

[创建内容页面时,我们有两个选择(XAMLC#),如下所示:enter image description here

1。在这种情况下,当我们选择ContentPage(c#)时,没有xaml。我们可以这样做:

public class TestPage1 : ContentPage
{
    public TestPage1 ()
    {
        var listView = new RadListView
        {
            BackgroundColor = Color.White,
            ItemsSource = new ViewModel().Source,
            ItemTemplate = new DataTemplate(() =>
            {
                var cell = new ListViewTextCell
                {
                    TextColor = Color.Black,
                    DetailColor = Color.Gray,
                };

                cell.SetBinding(ListViewTextCell.TextProperty, new Binding(nameof(Book.Title)));
                cell.SetBinding(ListViewTextCell.DetailProperty, new Binding(nameof(Book.Author)));

                return cell;
            }),
            LayoutDefinition = new ListViewLinearLayout { ItemLength = 70 },
        };

        Content = new StackLayout {
            Children = {
                listView
            }
        };
    }
}

2。当我们选择ContentPage时,在这种情况下,代码具有xaml。我们可以这样做。

将以下代码放入您的xaml中

<StackLayout>
    <telerikDataControls:RadListView ItemsSource="{Binding Source}" BackgroundColor="White" x:Name="listView">
        <telerikDataControls:RadListView.BindingContext>
            <local:ViewModel />
        </telerikDataControls:RadListView.BindingContext>
        <telerikDataControls:RadListView.ItemTemplate>
            <DataTemplate>
                <telerikListView:ListViewTextCell Text="{Binding Title}" Detail="{Binding Author}" TextColor="Black" DetailColor="Gray" />
            </DataTemplate>
        </telerikDataControls:RadListView.ItemTemplate>
        <telerikDataControls:RadListView.LayoutDefinition>
            <telerikListView:ListViewLinearLayout ItemLength="70" />
        </telerikDataControls:RadListView.LayoutDefinition>
    </telerikDataControls:RadListView>
</StackLayout>

并从您的代码中删除方法OnAppearing()

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();

        //BindingContext = new ViewModel();
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
    }
}

从上面的代码中,我们可以找到BindingContext,这是必需的。

<telerikDataControls:RadListView.BindingContext>
            <local:ViewModel />
</telerikDataControls:RadListView.BindingContext>

而且我们也可以像这样绑定Context(任何人都可以。):

 BindingContext = new ViewModel();

结果是相同的:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.