Xaml 自定义contentview中Listview的数据绑定

Xaml 自定义contentview中Listview的数据绑定,xaml,listview,xamarin,xamarin.forms,Xaml,Listview,Xamarin,Xamarin.forms,我正在尝试创建一个包含listview表单的contentview。 我想设置contentview的一个属性,然后使用该属性将数据绑定到listview 不幸的是,我无法填充它。 为了得到一个poc,我分解了这个例子。所需的结果应该是包含所有名称的contentpage。 谢谢你的帮助。提前谢谢 该示例包括: Contentpage: 添加contentview。 它还有一个到viewmodel-CompanyVM的bindingcontext。 将contentview的属性PersonLi

我正在尝试创建一个包含listview表单的contentview。 我想设置contentview的一个属性,然后使用该属性将数据绑定到listview

不幸的是,我无法填充它。 为了得到一个poc,我分解了这个例子。所需的结果应该是包含所有名称的contentpage。 谢谢你的帮助。提前谢谢

该示例包括: Contentpage: 添加contentview。 它还有一个到viewmodel-CompanyVM的bindingcontext。 将contentview的属性PersonList设置为PersonVM.PersonList。(不确定是否正确)

Contentview.XAML: contentview的XAML listview的绑定(不确定是否正确)

Contentview.cs XAML代码隐藏 contentview的属性设置

公司MM: 使用的视图模型

公司、人员和模型 简单分类与之一起工作

例子 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>
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; }
        }
    }
}
namespace ContentViewExample.ViewModel
{
公共类CompanyVM:ViewModelBase
{
可观察的集合人员;
字符串公司名称;
上市公司
{
companyname=“测试公司”;
人员=新的可观察集合();
foreach(MockData.GetPeople()中的Person项)
增加(项目);
}
公共字符串公司
{
set{SetProperty(ref companyname,value);}
获取{return companyname;}
}
公众人士
{
set{SetProperty(ref persons,value);}
获取{返回人员;}
}
}
}
公司和个人

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;
    }
}
上市公司
{
公共字符串名称{get;set;}
}
公共阶层人士
{
公共字符串名称{get;set;}
}
公共静态类数据
{
公共静态列表GetPeople()
{
列表tmp=新列表
{
新人
{
Name=“Ted”
},
新人
{
Name=“詹妮弗”
},
新人
{
Name=“安迪”
},
新人
{
Name=“奥斯卡”
}
};
返回tmp;
}
}

您已尝试通过以下方式绑定
personlistCV.Company

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

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

在Contentview.XAMLhi@Arvindraja中尝试将
ItemsSource=“{Binding Company.Persons}”>
转换为
ItemsSource=“{Binding Persons}”>
这一点-谢谢你的提示。@G.hakim如果这是真的,你应该发表评论,让我来编辑答案。虽然修正答案或改进格式的更改是完全可以接受的,我认为修改答案的内容应该留给答案的原始作者。正如@G.hakim所指出的:有一个从
List
observateCollection
的直接转换,因此,填充模拟数据的每个循环都可以是一行代码,类似这样:
persons=newObservableCollection(MockData.GetPeople())嗨@Paul Kertscher谢谢你的帮助。->很抱歉,如果这个例子没有多大意义,但是您详细的回答帮助了我,因为我对xaml非常陌生。1.理解
x:References
实际引用:)2。在绑定中使用
Source
,显式设置绑定源。3.
{Binding.}
用作视图Bindingreference的缩写。@jan.michael很高兴我能帮忙:)
<StackLayout>
    <cv:personlistCV Company="{x:Reference mainpage }"/>
    <!--Is this correct?-->
</StackLayout>
<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 .}"/>
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); }
    }
}