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

Telerik UI for Xamarin: Property not found for RadListView Binding

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

尝试将 属性 绑定到 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,但我也无法让它工作。

我没有从你的 code.And 中找到 BindingContext 我猜你混淆了 ContentPage(XAML 和 C#)的两种用法。

当我们创建内容页面时,我们有两个选择(XAMLC#)如下:

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

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.When我们选择ContentPage,在本例中,代码中有xaml.We可以这样做。

将以下代码放入您的 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>

我们也可以像这样使用BindingContext(任何一个都可以。):

 BindingContext = new ViewModel();

结果是一样的: