2016-04-29 91 views
0

我尝试在xaml页面后面的代码中使用名为“People”的公共静态属性,并将其填充到页面后面的代码构造函数中。然后在xaml页面中,我将该公共属性绑定到Xamarin.Forms ListView小部件的ItemsSource。但在运行它时,我没有看到列表视图项被填充。该列表视图没有任何显示。我在这里做错了什么?请帮忙。将xaml页面后面的代码属性绑定到列表视图

我猜的页面类后面的代码的构造函数绑定后的ListView的项目的数据呈现。但我不知道

代码:

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="Mvvm2.Mvvm2Page" 
      x:Name="page"> 
    <ContentPage.Padding> 
    <OnPlatform x:TypeArguments="Thickness" iOS="0,20,0,0" /> 
    </ContentPage.Padding> 


    <Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"></ColumnDefinition> 
     <ColumnDefinition Width="0"></ColumnDefinition> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"></RowDefinition> 
    </Grid.RowDefinitions> 



    <ListView x:Name="listViewPeople" HasUnevenRows="True" Grid.Column="0" Grid.Row="0" Header="People List" 
       ItemsSource="{Binding Source={x:Reference page}, Path=People}"> 

     <ListView.ItemTemplate> 
     <DataTemplate> 
      <ViewCell> 
      <ContentView Padding="5"> 
       <Frame OutlineColor="Accent" Padding="10"> 
       <StackLayout Orientation="Horizontal"> 
        <StackLayout> 
        <Label Text="{Binding Id}"></Label> 
        <Label Text="{Binding FirstName}"></Label> 
        <Label Text="{Binding LastName}"></Label> 
        <Label Text="{Binding Age}"></Label> 
        </StackLayout> 
       </StackLayout> 
       </Frame> 
      </ContentView> 
      </ViewCell> 
     </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
    </Grid> 
</ContentPage> 


using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using Xamarin.Forms; 

namespace Mvvm2 
{ 
    public partial class Mvvm2Page : ContentPage 
    { 
     public static List<Person> People; // public static property 

     public Mvvm2Page() 
     { 
      InitializeComponent(); 

      // fill property "People" 
      People = new List<Person>(); 
      People = getPeople(); 
     } 


     private List<Person> getPeople() 
     { 
      var list = new List<Person>(); 

      var p1 = new Person { Id = 1, Age = 19, FirstName = "Anna", LastName = "Larson" }; 
      var p2 = new Person { Id = 2, Age = 23, FirstName = "Beri", LastName = "Slovik" }; 
      var p3 = new Person { Id = 3, Age = 65, FirstName = "Ron", LastName = "Prelosi" }; 
      var p4 = new Person { Id = 4, Age = 32, FirstName = "William", LastName = "Maxel" }; 
      var p5 = new Person { Id = 5, Age = 71, FirstName = "Fred", LastName = "Lipez" }; 
      var p6 = new Person { Id = 6, Age = 44, FirstName = "Dave", LastName = "Vanoviz" }; 


        list.Add(p1); 
        list.Add(p2); 
        list.Add(p3); 
        list.Add(p4); 
        list.Add(p5); 
        list.Add(p6); 

      return list; 
     } 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Mvvm2 
{ 
    public class Person 
    { 
     public int Id { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public int Age { get; set; } 
    } 


} 

回答

3

表达

public static List<Person> People; // public static property 

不声明的属性,但一个字段。

你所需要的就是一个非静态公共财产:

public static List<Person> People { get; set; } 

万一属性的值以后可能会改变,你应该创建声明属性视图模型类,并实现了INotifyPropertyChanged接口:

public class ViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private List<Person> people; 
    public List<Person> People 
    { 
     get { return people; } 
     set 
     { 
      people = value; 
      OnNotifyPropertyChanged(nameof(People)); 
     } 
    } 

    private void OnNotifyPropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

你将这个类的一个实例分配到DataContext你的页面的

InitializeComponent(); 
var viewModel = new ViewModel(); 
viewModel.People = getPeople(); 
DataContext = viewModel; 

,并写在XAML为

ItemsSource="{Binding People}" 

绑定如果以后要设置视图模型的人民属性,您可以简单地通过DataContext属性访问它像

((ViewModel)DataContext).People = getPeople(); 

,或者你只是将ViewModel实例存储在类成员中。

+0

谢谢您的答复。我会尝试你的解决方案。 –

-1

请的ObservableCollection

尝试defind属性这样

public ObservableCollection<People> Peoples { get; set; } 

然后在constructory

Peoples=new ObservableCollection<People>(); 

var p1 = new Person { Id = 1, Age = 19, FirstName = "Anna", LastName = "Larson" }; 
      var p2 = new Person { Id = 2, Age = 23, FirstName = "Beri", LastName = "Slovik" }; 
      var p3 = new Person { Id = 3, Age = 65, FirstName = "Ron", LastName = "Prelosi" }; 
      var p4 = new Person { Id = 4, Age = 32, FirstName = "William", LastName = "Maxel" }; 
      var p5 = new Person { Id = 5, Age = 71, FirstName = "Fred", LastName = "Lipez" }; 
      var p6 = new Person { Id = 6, Age = 44, FirstName = "Dave", LastName = "Vanoviz" }; 




        Peoples.Add(p1); 
        Peoples.Add(p2); 
        Peoples.Add(p3); 
        Peoples.Add(p4); 
        Peoples.Add(p5); 
        Peoples.Add(p6); 
+0

请问为什么downvote – suulisin

相关问题