Привязка данных Listview в пользовательском представлении содержимого - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь создать представление содержимого, которое имеет представление списка xamarinforms.Я хочу установить свойство представления содержимого, которое затем используется для привязки данных к представлению списка.

К сожалению, я не могу его заполнить.Я сломал пример, чтобы получить Poc.Желаемым результатом должна быть контентная страница со всеми именами.Любой помощник оценил.Спасибо заранее!

Пример состоит из: Страница содержимого: Добавляет представление содержимого.Он также имеет обязательный контакт для модели представления - CompanyVM.Устанавливает свойство PersonList для contentview в PersonVM.Personlist.(Не уверен, если правильно)

Contentview.XAML: XAML привязок просмотра содержимого Привязки для просмотра списка (не уверен, что правильно)

Contentview.cs Код XAML-настройки свойств для просмотра содержимого

CompanyVM: используемая модель представления

Company & Person & Mockup Простой класс для работы с

Пример

ContentMainPage

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:cv="clr-namespace:ContentViewExample.XAML"
             xmlns:vm="clr-namespace:ContentViewExample.ViewModel"
             xmlns:local="clr-namespace:ContentViewExample"
             x:Class="ContentViewExample.MainPage"
             x:Name="mainpage">

    <ContentPage.BindingContext>
        <vm:CompanyVM/>
    </ContentPage.BindingContext>

    <StackLayout>
        <cv:personlistCV Company="{x:Reference mainpage }"/>
        <!--Is this correct?-->
    </StackLayout>

</ContentPage>

`` `

Contentview.XAML

<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ContentViewExample.XAML.personlistCV"
             x:Name="cvPersons">
  <ContentView.Content>
      <StackLayout>
            <ListView x:Name="lstPerson"
                  ItemsSource="{Binding Company.Persons}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <StackLayout Orientation="Horizontal">
                                <Label  Text="{Binding Path=Name}"/>
                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

        </StackLayout>
  </ContentView.Content>
</ContentView>

Contentview.cs

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace ContentViewExample.XAML
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class personlistCV : ContentView
    {
        public personlistCV ()
        {
            InitializeComponent ();
        }

        //CompanyProperty
        public static readonly BindableProperty CompanyProperty =
            BindableProperty.Create(
                "Company",
                typeof(CompanyVM),
                typeof(personlistCV),
                null);

        public personlistCV Company
        {
            set { SetValue(CompanyProperty, value); }
            get { return (personlistCV)GetValue(CompanyProperty); }
        }
    }
}

CompanyVM

namespace ContentViewExample.ViewModel
{
    public class CompanyVM: ViewModelBase
    {
        ObservableCollection<Person> persons;
        string companyname;

        public CompanyVM()
        {
            companyname = "Test Company";
            persons = new ObservableCollection<Person>();

            foreach (Person item in MockData.GetPeople())
                persons.Add(item);
        }

        public string Company
        {
            set { SetProperty(ref companyname, value); }
            get { return companyname; }
        }


        public ObservableCollection<Person> Persons
        {
            set { SetProperty(ref persons, value); }
            get { return persons; }
        }
    }
}

Company & Person

public class Company
{
    public string Name { get; set; }
}
public class Person
{
    public string Name{get;set;}
}

public static class MockData
{
    public static List<Person> GetPeople()
    {
        List<Person> tmp = new List<Person>
        {
            new Person
            {
                Name="Ted"
            },
            new Person
            {
                Name="Jennifer"
            },
            new Person
            {
                Name="Andy"
            },

            new Person
            {
                Name="Oscar"
            }
        };

        return tmp;
    }
}

1 Ответ

0 голосов
/ 17 октября 2018

Вы пытались связать personlistCV.Company следующим образом

<StackLayout>
    <cv:personlistCV Company="{x:Reference mainpage }"/>
    <!--Is this correct?-->
</StackLayout>

Я вижу несколько проблем здесь:

  • Привязки устанавливаются с расширением XAML Binding
  • Company установлен на mainpage, который имеет тип MainPage.
    • Лучше установить mainpage.BindingContext (это CompanyCV объект)

Кроме того, personlistCV.Company имеет тип personlistCV, что на самом деле не имеет смысла.Поле должно иметь тип CompanyVM, так как мы хотели бы связать viewmodel (а personlistCV даже не имеет свойства Persons (bindable)).

Сказав это, следующеекод должен работать:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:cv="clr-namespace:ContentViewExample.XAML"
             xmlns:vm="clr-namespace:ContentViewExample.ViewModel"
             xmlns:local="clr-namespace:ContentViewExample"
             x:Class="ContentViewExample.MainPage"
             x:Name="mainpage">

    <ContentPage.BindingContext>
        <vm:CompanyVM/>
    </ContentPage.BindingContext>

    <StackLayout>
        <cv:personlistCV Company="{Binding Path=BindingContext, Source={x:Reference mainpage}}"/> <!-- Bind the element to `mainpage.BindingContext` --> 
    </StackLayout>
</ContentPage>

Может быть,

<cv:personlistCV Company="{Binding .}"/>

тоже может работать, так как . обычно связывается с BindingContext представления и BindingContext страницыпередается в представления (если для явных представлений явно не установлено другое значение BindingContext).

И для companyCV

public partial class personlistCV : ContentView
{
    public personlistCV ()
    {
        InitializeComponent ();
    }

    //CompanyProperty
    public static readonly BindableProperty CompanyProperty =
        BindableProperty.Create(
            "Company",
            typeof(CompanyVM),
            typeof(personlistCV),
            null);

    public CompanyVM Company
    {
        set { SetValue(CompanyProperty, value); }
        get { return (personlistCV)GetValue(CompanyProperty); }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...