Telerik UI для Xamarin: свойство не найдено для привязки RadListView - PullRequest
0 голосов
/ 15 октября 2019

Я работаю над приложением Android с Xamarin, используя Telerik UI.

При попытке связать свойство с Telerik ListViewTextCell в RadListView возникает следующая ошибка:

[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 необходим, но я также не мог заставить это работать.

1 Ответ

1 голос
/ 16 октября 2019

Я не нашел BindingContext в вашем коде. И я предполагаю, что вы перепутали два использования ContentPage (XAML и C #).

Когда мы создали страницу контента, у нас есть два варианта (XAML и C#) следующим образом: 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>

Имы также можем BindingContext, как это (любой в порядке.):

 BindingContext = new ViewModel();

Результат тот же: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...