【问题标题】:Telerik UI for Xamarin: Property not found for RadListView BindingXamarin 的 Telerik UI:未找到 RadListView 绑定的属性
【发布时间】:2020-02-12 04:40:17
【问题描述】:

我正在使用 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】:

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

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

    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>
    

    而且我们也可以像这样BindingContext(随便一个都可以):

     BindingContext = new ViewModel();
    

    结果是一样的:

    【讨论】:

    • 完全使用您的示例,一个没有任何 XAML 并且只有您给定 C# 的页面,给了我完全相同的错误。
    • 这里是demo,你可以查看。github.com/jessiezh0320/TelerikXamarinApp1
    • 现在看来问题与 Book 类所在的命名空间有关。感谢您的帮助。
    • 这是我的荣幸。快乐的编码... :)
    猜你喜欢
    • 2018-02-28
    • 2021-11-10
    • 2016-03-09
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    相关资源
    最近更新 更多