自定义contentview中Listview的数据绑定

时间:2018-10-17 09:11:44

标签: xaml listview xamarin xamarin.forms

我正在尝试创建一个具有xamarinforms列表视图的contentview。 我想设置contentview的属性,然后将其用于将数据绑定到listview。

很遗憾,我无法填充它。 我分解了这个例子,以得到一个poc。期望的结果应该是包含所有名称的内容页。 任何人都赞赏。提前谢谢!

该示例包括: 内容页面:   添加contentview。    它还具有与视图模型的绑定上下文-CompanyVM。   将contentview的属性PersonList设置为PersonVM.Personlist。 (不确定是否正确)

Contentview.XAML:   ContentView的XAML    列表视图的绑定(不确定是否正确)

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

CompanyVM:   使用的视图模型

公司与人员和模型   简单分类即可使用

示例

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; }
        }
    }
}

公司和人员

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 :(得分:1)

您已尝试通过以下方式绑定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,因为我们想绑定视图模型(personlistCV甚至没有Persons(可绑定)属性)。

话虽如此,以下代码应该可以工作:

<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); }
    }
}